使用 c# 反射使用方法创建对象

本文关键字:创建对象 使用方法 反射 使用 | 更新日期: 2023-09-27 18:32:05

我有一个问题,在 c# 中加载 dll 后,我需要使用反射创建一个 tfs 版本控制服务器对象。但是,我在反射中初始化它时遇到问题,因为它没有构造函数。如果不进行反射,则通常在团队项目集合对象中使用 getService 方法创建对象。这是我的代码:

namespace SendFiletoTFS
{
    class Program
    {
        static void Main(string[] args)
        {
            String tfsuri = @"uri";
            NetworkCredential cred = new NetworkCredential("user", "password", "domain");
            // Load in the assemblies Microsoft.TeamFoundation.Client.dll and Microsoft.TeamFoundation.VersionControl.Client.dll
            Assembly tfsclient = Assembly.LoadFrom(@"C:'Program Files (x86)'Microsoft Visual Studio 11.0'Common7'IDE'ReferenceAssemblies'v2.0'Microsoft.TeamFoundation.Client.dll");
            Assembly versioncontrol = Assembly.LoadFrom(@"C:'Program Files (x86)'Microsoft Visual Studio 11.0'Common7'IDE'ReferenceAssemblies'v2.0'Microsoft.TeamFoundation.VersionControl.Client.dll");
            // Create Team Project Collection
            Type tpcclass = tfsclient.GetType(@"Microsoft.TeamFoundation.Client.TfsTeamProjectCollection");
            // The 'getService' method.
            MethodInfo getService = tpcclass.GetMethods()[32];
            object tpc = Activator.CreateInstance(tpcclass, new object[] { new Uri(tfsuri), cred });

            Type VersionControlServerClass = versioncontrol.GetType(@"Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer");
            // Code I'm trying to emulate in reflection, this is how I would normally do it without reflection.
            //VersionControlServer versionControl = tpc.GetService<VersionControlServer>();
            // Create VersionControlServer Class. This line will not work and give a no constructor found exception.
            object vcs = Activator.CreateInstance(VersionControlServerClass, new object[] { tpc });
           //How do I create the vcs object ?
        }
    }
}

有没有办法在团队项目集合类中使用 getService 方法创建此版本控制服务器对象?

任何帮助将不胜感激。

使用 c# 反射使用方法创建对象

您可以通过以下方式调用该方法:

var closedMethod = getService.MakeGenericMethod(VersionControlServerClass);
object vcs = closedMethod.Invoke(tpc, null);

请注意,不应使用类似 tpcclass.GetMethods()[32]; 的内容,因为反射不能保证返回方法的顺序。更好地利用GetMethod([methodname]);

请注意,TfsTeamProjectCollection实现了IServiceProvider,它实际上具有GetService的非泛型版本:

object vcs = ((IServiceProvider)tpc).GetService(VersionControlServerClass);