【问题标题】:Generic type parameter to set a List of a dynamic Type on runtime用于在运行时设置动态类型列表的通用类型参数
【发布时间】:2017-09-20 08:54:49
【问题描述】:

我有一个在运行时生成的动态Type,比如myGeneratedType。我正在尝试创建以下类的实例,其中T 应该是myGeneratedType。我遇到了几个答案,其中必须将动态类型设置为类的属性,但似乎无法让它在 List<T> 上工作:

Type myGeneratedType;

private class Container<T>
{
    public string a { get; set; }
    public string b { get; set; }
    public List<T> c { get; set; }
}

void Main()
{
    Container<myGeneratedType> c = new Container<myGeneratedType>(); 
}

显然,我的方法Main() 中的代码行不起作用。我应该怎么做才能以我的动态类型作为泛型类型参数创建一个Container 类?

【问题讨论】:

  • 您还遇到了哪些其他答案,为什么它们不起作用?
  • 使用 MakeGenericType: msdn.microsoft.com/en-us/library/…
  • 您能否添加一些上下文,例如您将要使用c 做什么?如果您在编译时不知道该类型,您可以像@YairHalberstadt 建议的那样构造Type,但这无助于声明c 并使用它。你到底想达到什么目的?
  • @RenéVogt 我正在尝试反序列化不同的 JSON 消息,容器始终相同,但数据 (List&lt;T&gt;) 不是。在运行时,我确实有关于T 定义的元数据,我用它来生成myGeneratedType。最后,我希望能够像(new System.Web.Script.Serialization.JavaScriptSerializer()) .Deserialize(json, typeof(Container&lt;&gt;).MakeGenericType(myGeneratedType)) 那样反序列化它

标签: c# .net generics types


【解决方案1】:

使用 MakeGenericType:

        var type = typeof(Container<>);
        var MyGenericType = type.MakeGenericType(myGeneratedType));

其中myGeneratedType 是Type

【讨论】:

  • typeof(Container&lt;&gt;) 对我来说是null。我做错了吗?
  • @Aquillo 你肯定做错了什么,typeof(Container&lt;&gt;) 无法返回null。
  • 对我来说很好。
  • myGeneratedType 的类型为 Type - 描述该类型的 Type 实例。所以它必须是type.MakeGenericType(myGeneratedType)。您的代码生成一个代表Container&lt;Type&gt; 的Type 实例。
  • @RenéVogt @YairHalberstadt 它确实有效,在typeof(Container&lt;&gt;).MakeGenericType(myGeneratedType) 上调试我的手表时,会出现消息'typeof(Container&lt;&gt;)' is null。但是,在运行时测试它(然后是你的两个 cmets)它确实有效。谢谢!
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多