C#如何使用“Type”类型的对象初始化Generic类

我最近有这个问题。

doSomething(typeof(int)); doSomething(typeof(MyClassA)); doSomething(typeof(MyClassB)); public void doSomething(Type _type) { var myGenObj = new MyGenericClass(); // Error. Really I'd want MyGenericClass, MyGenericClass, etc depending on what's passed in. myGenObj.doSomeGenStuff(); // more stuff... } 

我认为这可以通过某种方式进行反思。可能有一种更简单的方法。 关于Type的工作方式和类下的Classes,我有点困惑。 无论如何,谢谢你的帮助。

谢谢。

你想要Type.MakeGenericType然后是Activator.CreateInstance …但是然后在新创建的对象上调用方法将是棘手的。 理想情况下,您可以拥有包含这些成员的非generics基类或接口:

 public interface IFoo { void CallSomeMethod(); } public class MyGenericClass : IFoo { ... } // Names changed to be more conventional public void DoSomething(Type type) { var genericType = typeof(MyGenericClass<>).MakeGenericType(type); var instance = (IFoo) Activator.CreateInstance(genericType); instance.CallSomeMethod(); } 

如果你确实需要调用一个取决于类型参数的方法,你需要使用reflection dynamic来调用基于reflection的代码。

编辑:正如cdhowie所说,如果你总是在编译时确实知道类型,你可以使用一个通用的方法,这将使事情变得更简单。 然后你会调用这样的方法:

 DoSomething(); DoSomething(); DoSomething(); 

像这样:

 object myGenObj = Activator.CreateInstance(typeof(MyGenericClass<>).MakeGenericType(_type)); 

但是,由于生成的对象是您在编译时不知道的类型,因此无法通过generics类型(通过reflection除外)实际调用对象的成员。 如果在编译时存在您知道的祖先类型或已实现的接口, 可以转换为该接口,然后调用该成员。

您可能还会考虑将此function包装在通用方法中,这使得整个过程更容易处理:

 public void doSomething() { var myGenObj = new MyGenericClass(); myGenObj.doSomeGenStuff(); } 

如果必须支持Type对象,则可以使用使用reflection作弊的重载:

 public void doSomething(Type _type) { this.GetType().GetMethod("doSomething", Type.EmptyTypes) .MakeGenericMethod(_type) .Invoke(this, null); }