今天寫代碼時偷懶用了dynamic,結果遇到問題,運行時始終無法獲取dynamic對象的屬性。原問題簡化後如下:
程序集A包含SampleClass類,有一個靜態方法,接收一個dynamic類型參數並將其Value屬性輸出。
public class SampleClass { public static void Output (dynamic result) { Console.WriteLine (result.Value); } }
程序集B引用程序集A並調用Output方法:
SampleClass.Output (new { Value = something.CurrentValue });
運行結果是:
"Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: object does not contain a definition for Value"
而且在調試時,是可以看到result的Value屬性值的:
用反射也可以看到確實有Value這個屬性,但這裡就是無法輸出,原因是什麼?
------------------------------------------
答:因為匿名類型默認是private的,所以在B程序集中定義的匿名類型,A程序集是無法直接獲取其成員信息的,因而無法輸出。解決方法是預先定義public的數據類型。所以匿名類型的使用還是有很多限制的,類似的問題也出現在匿名方法上。