为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2019-06-05 15:56:06
将实例化的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‘。
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-06-05
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

一些额外的如何运行剪刀代码。假设您有一个类似于

public class Encoder() {public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }}

假设在运行时您有一个FooContent

如果您能够在编译时绑定

var fooContents = new List<FooContent>(fooContent)new Encoder().Markdown(fooContents)

不过您不能在运行时执行此操作。若要在运行时执行此操作,请按照以下方式执行:

var listType = typeof(List<>).MakeGenericType(myType);var dynamicList = Activator.CreateInstance(listType);((IList)dynamicList).Add(fooContent);

动态调用Markdown(IEnumerable<FooContent> contents)

new Encoder().Markdown( (dynamic) dynamicList)

注意…的用法dynamic在方法调用中。在运行时dynamicList将是List<FooContent>(此外还有IEnumerable<FooContent>)由于动态的使用仍然植根于强类型语言,运行时绑定程序将选择适当的Markdown方法。如果没有精确的类型匹配,它将查找对象参数方法,如果两者都不匹配,则会引发运行时绑定异常,提醒没有匹配的方法。

这种方法明显的缺点是在编译时类型安全性的巨大损失。然而,按照这些思路编写的代码将允许您在非常动态的意义上操作,即在运行时仍然是完全类型的,正如您所期望的那样。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 1143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信