【问题标题】:How to find IEnumerable<dynamic> element type? [duplicate]如何找到 IEnumerable<dynamic> 元素类型? [复制]
【发布时间】:2019-09-22 05:48:40
【问题描述】:

如果我尝试

List<dynamic> list = new List<dynamic> { "blah" };
var type = list.GetType().GetGenericArguments()[0];

我得到的是“对象”而不是 string。如何获得“真实”类型?

【问题讨论】:

  • 100 次动态中的 98 次不是正确的方法,并且会导致更多的问题然后解决。我这样说是因为如果你可以删除你正在做的事情的动态部分,你会发现后续的代码解决方案会更令人满意,更少hacky和更可预测
  • 如果您的列表包含不同的类型怎么办?例如List&lt;dynamic&gt; { "blah", 1 }?正如 TheGeneral 已经说过的那样,您通常根本不需要 dynamic 来获得“动态”的东西。
  • @TheGeneral 我同意你的观点,但动态来自生成的代码,不受我控制。
  • @HimBromBeere 好点,没想到这个问题。
  • @PeterDuniho 重复的问题是不同的问题。事件,因此答案包含有用的信息,因此无法找到它询问 my 问题。

标签: c# .net


【解决方案1】:

尝试先访问值,然后确定类型。

List<dynamic> list = new List<dynamic> { "blah", 15 };
var type = list[0].GetType();
Console.WriteLine(type); // prints out System.String

type = list[1].GetType();
Console.WriteLine(type); // prints out System.Int32

如果您想要所有类型的列表,请使用 Linq:

var types = list.Select(item => item.GetType());

// print out
foreach (var t in types) {
    Console.WriteLine(t);
}

【讨论】:

  • 我不想访问这些项目,但它似乎是唯一可能的解决方案,因为 @HimBromBeere 提到的 dynamic 背后的类型不同。
【解决方案2】:

Object 是这里的真实类型。您可以将 C# 中的 dynamic 视为具有特殊行为的对象,其中成员绑定发生在运行时而不是编译时。对于大多数类型,这就像反射的捷径。

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多