2009-10-21 34 views
8

我有一個通用的方法TResult Foo<TSource, TResult>(IEnumerable<TSource> source),如果TResult宣佈爲dynamic我想執行一個不同的代碼路徑比其他類型的聲明。如何測試typeof(動態)?

對於常規的類型,你可以做的東西,如:

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

需要這個? – Gishu 2009-10-21 04:57:58

回答

10

簡單地說你不能因爲沒有類型動力。如果類型出現在元數據中,則動態類型將被寫爲具有附加特殊屬性(動態)的對象。基本上說,對於大多數目的而言,typeof(動態)與typeof(對象)沒有區別。

+2

是的,只是做了Debug.Write(typeof(TResult).FullName,它確實是System.Object。 – dkackman 2009-10-21 04:44:21

1

這是沒有必要爲聲明爲dynamic是某種特定類型的對象的對象。它可以是DynamicObject的一個子類(因此爲查找操作提供了特定的邏輯),但它也可以是一個普通對象(就像@JaredPar所說的那樣)。

也許,如果你解釋你想爲dynamic對象什麼樣的分公司將有可能找到更好的解決辦法。

+0

增加了一些說明 – dkackman 2009-10-21 04:52:38