使用运行时的反射构造泛型的具体类型的实例

pan*_*los 2 c# generics reflection

考虑以下课程:

public class GenericClass<T>
{
   public T Argument;                
}
Run Code Online (Sandbox Code Playgroud)

第二个引用和使用GenericClass的类:

public class ClientClass
{
    GenericClass<T> genclass = new GenericClass<T>();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我在编译时不知道T的类型.我在运行时使用反射来获取T的类型.是否有可能在实例化时使用参数化表达式GenericClass

Dav*_*fer 5

是的,但你必须使用反射来构建你正在寻找的实际类型.

您首先需要通过使用typeof运算符来获得开放的泛型:

var openType = typeof(GenericClass<>);
Run Code Online (Sandbox Code Playgroud)

接下来,您需要构建所需的特定通用.假设您所需的类型T存储在变量中type:

var closedType = openType.MakeGenericType(type);
Run Code Online (Sandbox Code Playgroud)

最后,使用反射来创建该类型的实例.

object instance = Activator.CreateInstance(closedType);
Run Code Online (Sandbox Code Playgroud)

然而,正如评论中xanatos所述,您应该知道这会导致类型成员object.为了能够在没有反射的情况下操纵对象,您有两种选择.

  1. 您可以创建一个父类,GenericClass从它GenericClass<T>派生的,包括它通用于所有方法.(即GenericClass包含不需要使用的成员T.
  2. 正如Ingenu在关于这个问题的评论中提到的,你可以创建一个界面IInterface,然后添加一个限制T,where T : IInterface.然后,你可以投instanceGenericClass<IInterface>和操纵这种方式.显然,type必须IInterface在这种情况下实施.

你当然也可以保留object引用并仅使用反射来操作它,或者使用dynamic后期绑定任何方法调用 - 但是这会使用反射.

  • +1然后发现你不能在没有反射的情况下使用它:-)并且你甚至无法在没有反射或投射到物体的情况下传递它.这是一个悲伤的悲伤世界.您应该编写`object closeType`以使其显而易见. (2认同)