我有一个动态对象列表。在运行时,我想在列表中找到对象的类型,以便我可以实例化该类型的新列表。
List<dynamic> list1= new List<dynamic>() { new Test() {ID = 1} }
我想知道ID是int类型,所以我可以在Activator.CreateInstance语句中使用它。当我尝试使用以下语句获取类型时,我总是得到“对象”
Type typeInArgument = list1.GetType().GenericTypeArguments[0];
有没有办法获得这种类型?我看到了一些类似的问题,建议是使用
Type unknown = ((ObjectHandle)list1).Unwrap().GetType();
但是这不会为List编译。
我需要建议来解决这个问题。
答案 0 :(得分:3)
听起来它的效果和它可能的一样好。
因为您使用的是dynamic
,所以列表元素的最大公分母是 object
。只是因为你碰巧只有一个元素,这并不意味着运行时可以保证。
因此,你可能需要特殊情况才能找到你想要的东西。
Type ret;
if (list1.Count == 0)
ret = typeof(object);
else
ret = list1[0].GetType();
当然,如果您提供给我们的代码是字面意思,那么该检查是多余的。但我希望你明白这一点。
如果需要,您还可以添加一个检查以运行列表并查找是否所有项目都是相同的类型。
一般来说,听起来这可能不是使用dynamic
的好时机。如果你需要匿名类型,我建议你转移到具体的类型。如果你正在做你在这里做的事情,只需输入List<Test>
。
当然,如果您正在寻找的只是这个列表的克隆,那么您可以这样做并让它正确。为了便于阅读,我将其作为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;
当然,请记住,这并不能保证您更多地了解所包含的类型,当您尝试并实际阅读结果列表时,您将再次遇到相同的问题。
我真的建议在这里重新评估你对动态的使用。它确实允许一些本来不可能的事情,所以你可能会选择坚持下去,但值得再考虑一下。
答案 1 :(得分:2)
List<dynamic>
具有特定的内部类型。 dynamic
的重点在于它可以是任何东西。
相反,您可以获取列表中项目的类型:list1[0].GetType()
请注意,无法保证下一个项目属于同一类型。