我有MyClass<T>
var Myobj = authorObject.getType();
如何从MyClass
var
Myobj
对象
我测试了这段代码并且无效
var x = new MyClass<Myobj>();
答案 0 :(得分:4)
我假设您之前不知道要作为MyClass的类型参数提供的类型。您可以通过反射动态创建类型,例如:
var testVar = 123;
var genType = typeof(MyClass<>).MakeGenericType(testVar.GetType());
var genInstance = Activator.CreateInstance(genType);
Console.WriteLine(genInstance.GetType().FullName);
如果您需要访问MyClass<T>
的特定成员,我建议创建一个非泛型接口(或基类),其中包含MyClass实现的所需成员(分别派生自)。然后,您可以将Activator.CreateInstance的返回值转换为该接口,并使用接口定义的成员。
如果要访问依赖泛型类型参数的MyClass<T>
成员,则必须通过反射动态访问它们,因为通用类型定义是动态创建的。您可以使用InvokeMember方法。在下面的示例中,我假设MyClass<T>
包含属性值为T的值,我得到以下值:
object value = genType.InvokeMember("Value", BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.GetProperty,
null, genInstance, null);
Console.WriteLine(value);
如果您在设计时知道值的类型,您还可以转换InvokeMember的返回值。
如需完整样本,请参阅此link。
答案 1 :(得分:0)
您可以使用Type.MakeGenericType和Activator:
Type genType = typeof(MyClass<>);
Type type = genType.MakeGenericType(typeof(MyObj);
var x = Activator.CreateInstance(type);