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?
是的,但你必须使用反射来构建你正在寻找的实际类型.
您首先需要通过使用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.为了能够在没有反射的情况下操纵对象,您有两种选择.
GenericClass从它GenericClass<T>派生的,包括它通用于所有方法.(即GenericClass包含不需要使用的成员T.IInterface,然后添加一个限制T,where T : IInterface.然后,你可以投instance给GenericClass<IInterface>和操纵这种方式.显然,type必须IInterface在这种情况下实施.你当然也可以保留object引用并仅使用反射来操作它,或者使用dynamic后期绑定任何方法调用 - 但是这会使用反射.