我有一个通用方法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
?
修改
这是System.Linq.Expression评估程序的SQL文本的一部分。如果TResult
是动态的,那么分支的特定愿望是某些伪逻辑看起来像这样:
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
答案 0 :(得分:10)
简单地说,你不能,因为没有类型动态。在类型中,如果类型出现在元数据中,则动态写为具有附加特殊属性(动态)的对象。基本上,对于大多数用途,typeof(动态)与typeof(对象)没有什么不同。
答案 1 :(得分:1)
声明为dynamic
的对象不一定是某种特定类型的对象。它可以是DynamicObject
的子类(因此为操作查找提供特定逻辑),但它也可以是普通对象(如@JaredPar所述)。
也许,如果你解释一下你想为dynamic
个对象做什么样的分支,就有可能找到更好的解决方案。