C# 在c中查找动态对象的类型#
我有一个动态对象列表。在运行时,我希望在列表中找到对象的类型,以便可以实例化该类型的新列表C# 在c中查找动态对象的类型#,c#,.net,dynamic,C#,.net,Dynamic,我有一个动态对象列表。在运行时,我希望在列表中找到对象的类型,以便可以实例化该类型的新列表 List<dynamic> list1= new List<dynamic>() { new Test() {ID = 1} } 有没有办法得到这种类型?我在建议使用的地方看到了一些类似的问题 Type unknown = ((ObjectHandle)list1).Unwrap().GetType(); 但这并不适用于列表 我需要建议来解决这个问题。一个列表没有特定的内部类型
List<dynamic> list1= new List<dynamic>() { new Test() {ID = 1} }
有没有办法得到这种类型?我在建议使用的地方看到了一些类似的问题
Type unknown = ((ObjectHandle)list1).Unwrap().GetType();
但这并不适用于列表
我需要建议来解决这个问题。一个列表没有特定的内部类型。dynamic
的关键在于它可以是任何东西
相反,您可以获取列表中项目的类型:list1[0]。GetType()
请注意,不能保证下一项是同一类型。列表没有特定的内部类型。dynamic
的关键在于它可以是任何东西
相反,您可以获取列表中项目的类型:list1[0]。GetType()
请注意,不能保证下一个项目是同一类型的。听起来它工作得非常好
因为您使用的是动态
,列表元素的最大公分母是对象
。仅仅因为您恰好只有一个元素在其中,这并不意味着运行时可以保证这一点
因此,您可能需要对您正在寻找的内容进行特殊处理
Type ret;
if (list1.Count == 0)
ret = typeof(object);
else
ret = list1[0].GetType();
当然,如果你给我们的代码是字面意思,那么这种检查是多余的。但我希望你明白这一点
您还可以添加一个检查来遍历列表,并查找是否所有项目都是相同的类型(如果这是一个要求)
一般来说,这听起来可能不是使用dynamic
的好时机。如果您需要匿名类型,我建议您使用具体的类型。如果你正在做你在这里做的事情,只需将其作为列表键入即可
当然,如果你所要寻找的只是这个列表的一个克隆,你可以这样做,让它成为正确的。为了可读性,我把它作为一个foreach
,但是LINQ在这里是一个不错的选择
List<object> ret = new List<object>();
foreach (var v in list1)
{
var type = v.GetType();
ret.Add(/* new instance of type */);
}
return ret;
List ret=new List();
foreach(列表1中的var v)
{
var type=v.GetType();
ret.Add(/*类型为*/)的新实例;
}
返回ret;
当然,请记住,这并不能保证您对所包含的类型有更多的了解,当您尝试实际阅读结果列表时,您将再次遇到同样的问题
我真的建议您在这里重新评估dynamic的使用。它确实允许做一些本来不可能的事情,所以你可以选择坚持,但值得再三考虑。听起来它正尽可能地工作
因为您使用的是动态
,列表元素的最大公分母是对象
。仅仅因为您恰好只有一个元素在其中,这并不意味着运行时可以保证这一点
因此,您可能需要对您正在寻找的内容进行特殊处理
Type ret;
if (list1.Count == 0)
ret = typeof(object);
else
ret = list1[0].GetType();
当然,如果你给我们的代码是字面意思,那么这种检查是多余的。但我希望你明白这一点
您还可以添加一个检查来遍历列表,并查找是否所有项目都是相同的类型(如果这是一个要求)
一般来说,这听起来可能不是使用dynamic
的好时机。如果您需要匿名类型,我建议您使用具体的类型。如果你正在做你在这里做的事情,只需将其作为列表键入即可
当然,如果你所要寻找的只是这个列表的一个克隆,你可以这样做,让它成为正确的。为了可读性,我把它作为一个foreach
,但是LINQ在这里是一个不错的选择
List<object> ret = new List<object>();
foreach (var v in list1)
{
var type = v.GetType();
ret.Add(/* new instance of type */);
}
return ret;
List ret=new List();
foreach(列表1中的var v)
{
var type=v.GetType();
ret.Add(/*类型为*/)的新实例;
}
返回ret;
当然,请记住,这并不能保证您对所包含的类型有更多的了解,当您尝试实际阅读结果列表时,您将再次遇到同样的问题
我真的建议您在这里重新评估dynamic的使用。它确实允许一些本来不可能的事情,所以你可以选择坚持下去,但这值得再三考虑