【问题标题】:How to get the type of a dynamic object in C#?如何在 C# 中获取动态对象的类型?
【发布时间】:2014-07-02 10:35:55
【问题描述】:

我有一个List<dynamic>,我需要将列表的值和类型传递给服务。 服务代码是这样的:

 Type type = typeof(IList<>);
 // Type genericType = how to get type of list. Such as List<**string**>, List<**dynamic**>, List<**CustomClass**>
 // Then I convert data value of list to specified type.
 IList data = (IList)JsonConvert.DeserializeObject(this._dataSourceValues[i], genericType);

_dataSourceValues:列表中的值

如果 List 的类型是动态的 (List&lt;dynamic&gt;),我如何将列表的类型转换为特定类型?

【问题讨论】:

  • 如果你不知道编译时的类型你不能。(除非你使用反射)
  • 您不能将其转换为静态类型的对象,即使使用反射也是如此。
  • @MikeGoodwin 你知道 OP 为什么要投吗?当你有一个动态对象时,我不明白你为什么需要强制转换它。动态的主要原因不是逃避强类型问题吗?另外,为什么你认为反射没有帮助?

标签: c# .net list dynamic


【解决方案1】:

如果我理解正确,您有一个 List&lt;dynamic&gt; 并且您想创建一个具有适当运行时类型的动态对象的列表?

这样的事情会有所帮助吗:

private void x(List<dynamic> dynamicList)
{
    Type typeInArgument = dynamicList.GetType().GenericTypeArguments[0];
    Type newGenericType = typeof(List<>).MakeGenericType(typeInArgument);
    IList data = (IList)JsonConvert.DeserializeObject(this._dataSourceValues[i], newGenericType);
}

另一方面,我认为您应该重新考虑代码的设计。我真的没有足够的上下文,但我很好奇你为什么在这里使用动态。拥有List&lt;dynamic&gt; 基本上意味着您不在乎传入列表的类型是什么。如果你真的关心类型(看起来就像你在做序列化一样)也许你不应该使用动态。

【讨论】:

  • 感谢您的回复。我发现,动态是一种对象类型(当我使用 get 类型方法时)。关于重新思考代码:我有服务来呈现报告,所以我需要将所有资源以字符串形式传递给它,这就是我使用上述代码的原因。因为工作的需要,我不能说清楚。
【解决方案2】:
 private void x(List<dynamic> dynamicList)
            {
                Type typeInArgument = dynamicList.GetType();
                Type newGenericType = typeof(List<>).MakeGenericType(typeInArgument);
                IList data = (IList)JsonConvert.DeserializeObject(this._dataSourceValues[i], newGenericType);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多