我想做的是自动创建一些对象。
在Java中,类可以作为参数传递,例如
Class A{
}
Object createObjectBy(class clazz){
// .. do construction work here
}
when using it, just ---> createObjectBy(A.class)
这对很多事情都有好处。
所以,我怎么能在C#做类似的事情?
答案 0 :(得分:45)
Object createObjectBy(Type clazz){
// .. do construction work here
Object theObject = Activator.CreateInstance(clazz);
return theObject;
}
用法:
createObjectBy(typeof(A));
或者您可以直接使用Activator.CreateInstance
: - )
答案 1 :(得分:37)
理想的方法是使用泛型
public static T CreateInstance<T>() where T: new()
{
// Do some business logic
Logger.LogObjectCreation(typeof(T));
// Actualy instanciate the object
return new T();
}
调用示例看起来像
var employee = CreateInstance<Employee>();
如果对象的类型在运行时是未知的,例如通过插件系统,则需要使用Type
类:
public static object CreateInstance(Type type)
{
// Do some business logic
Logger.LogObjectCreation(type);
// Actualy instanciate the object
return Activator.CreateInstance(type);
}
调用示例看起来像
var instance = CreateInstance(someType);
当然,除了使用关键字new
之外,没有什么比实体化更好。除了可能不是实例化,而是重用一个对象,比如通过缓存。
如果你不得不接受第二种类型未知的方法,那就some alternatives到Activator.CreateInstance
。虽然文章建议使用lambda表达式,但最重要的考虑因素是:
如果您只需要创建一次对象,只需坚持使用Activator.CreateInstance方法即可。如果您需要在短时间内多次创建它,请尝试lambda方法。最后一种方法类似于编译的正则表达式与即时正则表达式。
答案 2 :(得分:5)
使用类Type。您可以通过调用
返回它的实例obj.GetType();
或没有对象实例
typeof(className);
我希望它有所帮助。
答案 3 :(得分:4)
C#不支持此功能。但是你想做什么?
您可能会使用:
createObjectBy(Type type);
或
createObjectBy<T>();