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的使用。它确实允许一些本来不可能的事情,所以你可以选择坚持下去,但这值得再三考虑