我有一个接收IList
. 有什么办法可以得到里面物品的类型IList
吗?
public void MiMetodo(IList miLista)
{
}
我有一个类,你可以关联一个IList
. 您还可以添加功能NuevoItem
来添加新项目。我希望能够使用默认的无参数构造函数添加项目,以防我的类的用户没有为函数赋值NuevoItem
。
我添加了一个示例,因为我的问题似乎并不清楚。如果我收到一个IList<Int32>
,我想知道该项目的类型,即我需要获取Int32
.
如何获取IList
通过参数接收到的项目的类型?我会知道我是否有一个IList<T>
,但我不能更改我的API,因为我们可以接收任何类型的集合,而不仅仅是IList<T>
. 唯一的限制,虽然没有被代码强制执行,但我们收到的集合中的所有项目都是相同的类型。
如果您传递给的对象的类型
miLista
是通用的,您可以检查miLista.GetType().IsGenericType
您可以使用属性获取项目的类型GenericTypeArguments
在这种情况下,它
.GenericTypeArguments
返回 aType[]
,其中第一个元素将是Type
您要查找的元素。在不是泛型的情况下,不能正确地说出元素类型,因为非泛型数组中的每个元素都可以是 any
Object
。在这种情况下,您可以假设您需要什么,例如:
如果至少有一个元素,则假设
Type
第一个元素的类型为IList
miLista[0].GetType();
如果至少有一个元素,则遍历 ,
IList
如果您确定所有元素都属于同一类型,则假设第一个元素的类型是 的类型IList
。miLista[0].GetType();
如果有多个不同类型的元素,假设
Object
null
如果您想确定所有可能的情况,此代码段可以提供帮助:
如果我理解正确,您需要知道列表的类型才能在运行时通过 Activator 添加新项目:
为此,您需要知道列表带来的对象类型;那么您需要获取列表的Item属性的类型,换句话说:
在您的特定情况下,它将是这样的:
完整的例子:
DotNetFiddle 中的示例链接:
https://dotnetfiddle.net/tnTLcw
最后:
只要它们不是 Object 类型,您就可以知道列表中项目的真实类型。
你试过一个简单的
卡洛斯的评论很重要:
你不需要反思来实现这一点。
在这种情况下,您将得到业务规则的支持,这足以实现您的目标:
执行
完整演示
使用它的正确方法可以像你在下面这个演示中看到的那样,我用各种类型进行测试以确保所有可能的场景
编码
输出