2009-03-03 27 views
6

在.NET中将字符串转换为Type对象的最佳方式是什么?从.NET中的字符串获取Type对象的最佳方式

要考虑的问题:

  • 的类型可以是在一个不同的组件。
  • 该类型的程序集可能尚未加载。

这是我的尝试,但它并没有解决第二个问题

Public Function FindType(ByVal name As String) As Type 
    Dim base As Type 

    base = Reflection.Assembly.GetEntryAssembly.GetType(name, False, True) 
    If base IsNot Nothing Then Return base 

    base = Reflection.Assembly.GetExecutingAssembly.GetType(name, False, True) 
    If base IsNot Nothing Then Return base 

    For Each assembly As Reflection.Assembly In _ 
     AppDomain.CurrentDomain.GetAssemblies 
     base = assembly.GetType(name, False, True) 
     If base IsNot Nothing Then Return base 
    Next 
    Return Nothing 
End Function 
+0

解决第二种情况很困难。一般如何知道卸载的组件所在的位置?否则看到[这个答案](http://stackoverflow.com/a/7286354/661933),相当不错。 – nawfal 2013-12-05 19:44:48

回答

3

您可能需要为第二个方法调用GetReferencedAssemblies()方法。

namespace reflectme 
{ 
    using System; 
    public class hello 
    { 
     public hello() 
     { 
      Console.WriteLine("hello"); 
      Console.ReadLine(); 
     } 
     static void Main(string[] args) 
     { 
      Type t = System.Reflection.Assembly.GetExecutingAssembly().GetType("reflectme.hello"); 
      t.GetConstructor(System.Type.EmptyTypes).Invoke(null); 
     } 
    } 
} 
9

您可以为了做到这一点使用Type.GetType(string)。类型名称必须是组件限定的,但该方法将根据需要加载组件。如果类型位于mscorlid或执行GetType调用的程序集中,则不需要程序集限定条件。

+0

请注意,如果未找到类型,则不会引发异常,它将返回null。如果您希望类型存在,那么使用Type.GetType(string,bool)重载并传递true将是值得的,如果类型不能被载入,则会抛出该错误。 – 2009-03-03 21:50:28

相关问题