2016-01-26 3 views
0

У меня возникла проблема, когда мне нужно создать объект сервера управления версиями tfs, используя отражение после загрузки dll в C#. У меня возникли проблемы с инициализацией его в отражении, поскольку он не имеет конструкторов. Без отражения вы обычно создаете объект с помощью метода getService в коллективном проекте коллективного проекта. Вот мой код:Создайте объект с помощью метода C# reflection

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 в классе сбора команды проекта?

Любая помощь была бы принята с благодарностью.

ответ

0

Вы можете вызвать метод таким образом:

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

Как примечание, вы не должны использовать что-то вроде tpcclass.GetMethods()[32]; потому что отражение не гарантирует вам порядок возвращаемых методами. Лучше использовать GetMethod([methodname]);

+0

Спасибо! с GetMethod ([methodname]); У меня есть проблема, что существует несколько методов с одним и тем же именем, поэтому я пытаюсь получить к нему доступ с помощью getmethods. Но это не всегда в том же порядке очень страшно. Есть ли способ обойти это? –

+0

@JamesWard Вы должны взять эту перегрузку затем: https://msdn.microsoft.com/en-us/library/6hy0h0z1%28v=vs.110%29.aspx. Если это не удается, используйте GetMethods и используйте метод linqs Single, чтобы указать, какой метод вы выполняете. – thehennyy

+0

Исключительно полезно, именно то, что мне нужно. –

0

Обратите внимание на TfsTeamProjectCollection орудия IServiceProvider, который на самом деле имеет необщего версии GetService:

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

О, очень полезно! Спасибо! –

Смежные вопросы