猿问

将实例化的System.Type作为泛型类的类型参数传递

将实例化的System.Type作为泛型类的类型参数传递

标题有点模糊。我想知道的是这是否可能:

string typeName = <read type name from somwhere>;Type myType = Type.GetType(typeName);MyGenericClass<myType> 
myGenericClass = new MyGenericClass<myType>();

显然,MyGenericClass被描述为:

public class MyGenericClass<T>

现在,编译器抱怨说无法找到‘类型或名称空间’myType‘。


隔江千里
浏览 1144回答 3
3回答

慕田峪4524236

不幸的是,没有。泛型参数在编译时必须可解析为:(1)有效类型或(2)另一个泛型参数。如果没有使用反射的大锤子,就无法基于运行时值创建通用实例。

慕姐4208626

一些额外的如何运行剪刀代码。假设您有一个类似于public&nbsp;class&nbsp;Encoder()&nbsp;{public&nbsp;void&nbsp;Markdown(IEnumerable<FooContent>&nbsp;contents)&nbsp;{&nbsp;do&nbsp;magic&nbsp;} public&nbsp;void&nbsp;Markdown(IEnumerable<BarContent>&nbsp;contents)&nbsp;{&nbsp;do&nbsp;magic2&nbsp;}}假设在运行时您有一个FooContent如果您能够在编译时绑定var&nbsp;fooContents&nbsp;=&nbsp;new&nbsp;List<FooContent>(fooContent)new&nbsp;Encoder().Markdown(fooContents)不过您不能在运行时执行此操作。若要在运行时执行此操作,请按照以下方式执行:var&nbsp;listType&nbsp;=&nbsp;typeof(List<>).MakeGenericType(myType);var&nbsp;dynamicList&nbsp;=&nbsp;Activator.CreateInstance(listType);((IList)dynamicList).Add(fooContent);动态调用Markdown(IEnumerable<FooContent> contents)new&nbsp;Encoder().Markdown(&nbsp;(dynamic)&nbsp;dynamicList)注意…的用法dynamic在方法调用中。在运行时dynamicList将是List<FooContent>(此外还有IEnumerable<FooContent>)由于动态的使用仍然植根于强类型语言,运行时绑定程序将选择适当的Markdown方法。如果没有精确的类型匹配,它将查找对象参数方法,如果两者都不匹配,则会引发运行时绑定异常,提醒没有匹配的方法。这种方法明显的缺点是在编译时类型安全性的巨大损失。然而,按照这些思路编写的代码将允许您在非常动态的意义上操作,即在运行时仍然是完全类型的,正如您所期望的那样。
随时随地看视频慕课网APP
我要回答