2012-03-24 70 views
29

实例化一个类别问我为什么,但我需要做到以下几点:从文本名称

string ClassName = "SomeClassName"; 
object o = MagicallyCreateInstance("SomeClassName"); 

我想知道有多少种方法做,这是在要使用的方法哪种情况。

例子:

  • Activator.CreateInstance
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • 任何其他建议,将不胜感激

这个问题并不意味着是一个开放式的讨论,因为我相信,只有这可以通过很多方式来实现。

+0

http://stackoverflow.com/questions/648160/how-do-i-create-an-instance-from-a-string-in-c – 2012-03-24 19:43:49

+0

嗯,你有什么可能的可能性猜测它的命名空间名称正确吗?它是从哪里来的? – 2012-03-24 19:47:51

+0

装配的类型是否已装入或未装入?如果这恰好是插件的问题,那么你可以查看MEF – 2012-03-25 04:42:23

回答

40

这里的方法可能是什么样子:

private static object MagicallyCreateInstance(string className) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 

    var type = assembly.GetTypes() 
     .First(t => t.Name == className); 

    return Activator.CreateInstance(type); 
} 

上面的代码假定:

  • 您正在寻找一类是在当前执行的程序集(这可以调整 - 只需将assembly更改为任何您需要的)
  • 在该程序集中只有一个类正在寻找您要使用的名称
  • c姑娘有一个默认的构造函数

更新:

以下是如何让所有从给定类派生(与同一程序中定义)类:

private static IEnumerable<Type> GetDerivedTypesFor(Type baseType) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 

    return assembly.GetTypes() 
     .Where(baseType.IsAssignableFrom) 
     .Where(t => baseType != t); 
} 
+0

正是我需要的,谢谢。我还需要枚举派生这个类的所有类。我假设'assembly.GetTypes'会允许。 – 2012-03-25 05:47:08

+1

@RaheelKhan我已经添加了一个代码示例以获取在相同程序集中定义的派生类。 – GolfWolf 2012-03-25 17:01:49

+0

我们上课之后,我们可以调用里面的方法吗? – andrefadila 2014-11-05 11:04:27

16
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName")); 

Activator.CreateInstance(null, "SomeNamespace.SomeClassName").Unwrap(); 

也有重载,您可以指定构造函数参数。