使用反射在 IList<T> 中查找 <T> [重复]

Posted

技术标签:

【中文标题】使用反射在 IList<T> 中查找 <T> [重复]【英文标题】:Finding <T> in IList<T> using reflection [duplicate] 【发布时间】:2011-12-26 16:09:08 【问题描述】:

我正在开展一个项目,我必须通过数据模型进行反思,以找出数据模型的每个属性中的类型。除了通用集合之外,我的代码适用于所有情况。我必须能够知道 IList 中的 T 是什么。

我有以下数据模型

public class ArrryOfObjects

    public NestModelNestedClass NestClass  get; set; 
    public int IntObject  get; set; 
    public IList<NestModelNestedClass> ListOfObjects  get; set; 

我看过几个例子,比如https://***.com/a/1043778/136717 说明如何做到这一点,但他们使用type.GetGenericTypeDefinition() 来获取类型。但在我的示例中,我不能使用它,因为 'type.IsGeneric.Parameter' 是假的。

我查看了 Type 文档,但不明白如何执行此操作。

【问题讨论】:

【参考方案1】:

试试这个:

var t = typeof(ArrryOfObjects)
    .GetProperty("ListOfObjects")
    .PropertyType
    .GetGenericArguments()[0];

这就是它的工作原理:

来自ArrryOfObjects的类型... 获取名为ListOfObjects的属性... 获取该属性的类型... 我们知道它是具有至少一个类型参数的泛型类型。 我们得到第一个类型参数——在你的例子中它应该是typeof(NestModelNestedClass)

附: GetGenericTypeDefinition 得到typeof(IList&lt;&gt;),其中IList&lt;NestModelNestedClass&gt; 是泛型实例的泛型类型。

【讨论】:

谢谢。我的实际代码与您的基本相同,除了 GetGenericArguements() 上的 [0]。

以上是关于使用反射在 IList<T> 中查找 <T> [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 `IList<T>` 不从 `IReadOnlyList<T>` 继承?

C#从反射类型实例化通用列表[重复]

IList<T> 到 IQueryable<T>

IList<T> 和 IReadOnlyList<T>

C# IList<T>的用法?

如何对 IList<T> 执行二进制搜索?