不要问我为什么,但我需要做以下事情:
string ClassName = "SomeClassName";
object o = MagicallyCreateInstance("SomeClassName");
我想知道有多少方法可以做到这一点,以及在哪种情况下使用哪种方法。
示例:
Activator.CreateInstance
Assembly.GetExecutingAssembly.CreateInstance("")
这个问题并不是一个开放式讨论,因为我相信只有这么多方法可以实现。
答案 0 :(得分:48)
这是方法的样子:
private static object MagicallyCreateInstance(string className)
{
var assembly = Assembly.GetExecutingAssembly();
var type = assembly.GetTypes()
.First(t => t.Name == className);
return Activator.CreateInstance(type);
}
上面的代码假定:
assembly
更改为您需要的任何内容)<强>更新强>
以下是如何获取从给定类派生的所有类(并在同一个程序集中定义):
private static IEnumerable<Type> GetDerivedTypesFor(Type baseType)
{
var assembly = Assembly.GetExecutingAssembly();
return assembly.GetTypes()
.Where(baseType.IsAssignableFrom)
.Where(t => baseType != t);
}
答案 1 :(得分:17)
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName"));
或
Activator.CreateInstance(null, "SomeNamespace.SomeClassName").Unwrap();
还有一些重载可以指定构造函数参数。
答案 2 :(得分:0)
使用这种方式使用没有完全限定命名空间的类名:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("myclass");