代码之家  ›  专栏  ›  技术社区  ›  dkackman Srinivas Kokkula

如何测试typeof(动态)?

  •  8
  • dkackman Srinivas Kokkula  · 技术社区  · 16 年前

    我有一个通用方法 TResult Foo<TSource, TResult>(IEnumerable<TSource> source) 如果 TResult 被宣布为 dynamic 我希望执行与其他类型声明不同的代码路径。

    对于常规类型,您可以执行以下操作:

    if (typeof(TResult) == typeof(int))
        return ExpressionFactory.CreateExpandoFunction<TSource, TResult>();
    

    但是 if (typeof(TResult) == typeof(dynamic)) 不编译。

    当使用声明调用方法时,是否仍要在运行时进行此类确定:

    dyanmic x = Foo<int, dynamic>(list);
    

    既然动态本身不是一个类型,我应该测试什么? IDynamicMetaObjectProvider ?

    编辑 这是SQL文本到System.Linq.Expression计算器的一部分。如果 结果 是动态的是一些类似于这样的伪逻辑:

    if (type is struct)
       create selector that initializes each element to result values
    else if (type is class)
       create selector that initialize each element to new instance and set member properties
    else if (type is dynamic)
       create selector that initializes each element to new `ExpandoObject` and populates/sets member properties
    
    2 回复  |  直到 9 年前
        1
  •  10
  •   JaredPar    16 年前

    简单地说你不能,因为没有动态类型。如果类型出现在元数据中,那么in-type dynamic将作为附加了特殊属性(dynamic)的对象写出。本质上说,在大多数情况下,typeof(dynamic)和typeof(object)没有什么不同。

        2
  •  1
  •   elder_george    16 年前

    对于声明为 dynamic 是某种特定类型的对象。它可以是 DynamicObject (并因此为操作查找提供特定的逻辑),但它也可以是普通对象(如@jaredpar所说)。

    也许,如果你解释一下你想做什么样的分支 动态 对象可以找到更好的解决方案。