如何在C#中使用类名作为参数

时间:2010-02-03 19:50:05

标签: c#

我想做的是自动创建一些对象。

在Java中,类可以作为参数传递,例如

Class A{

}


Object createObjectBy(class clazz){
       // .. do construction work here
}

when using it, just ---> createObjectBy(A.class)

这对很多事情都有好处。

所以,我怎么能在C#做类似的事情?

4 个答案:

答案 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 alternativesActivator.CreateInstance。虽然文章建议使用lambda表达式,但最重要的考虑因素是:

  • 您的未知对象是否需要在短时间内实例化,或者您只创建一次

如果您只需要创建一次对象,只需坚持使用Activator.CreateInstance方法即可。如果您需要在短时间内多次创建它,请尝试lambda方法。最后一种方法类似于编译的正则表达式与即时正则表达式。

答案 2 :(得分:5)

使用类Type。您可以通过调用

返回它的实例
obj.GetType();

或没有对象实例

typeof(className);

我希望它有所帮助。

答案 3 :(得分:4)

C#不支持此功能。但是你想做什么?

您可能会使用:

createObjectBy(Type type);

createObjectBy<T>();