2012-12-23 90 views
3

似乎每次dynamic被一個通用方法的調用者使用,實際使用的類型是一個簡單的object。例如,代碼:如何知道類型參數是否是動態的?

public static void Main() 
{ 
    Program.DoSomething<int>(); 
    Program.DoSomething<object>(); 
    Program.DoSomething<dynamic>(); 

    Console.WriteLine("Press any key to continue..."); 
    Console.ReadKey(true); 
} 

public static T DoSomething<T>() where T : new() 
{ 
    Console.WriteLine(
     "The type is: {0}; equal to object: {1}.", 
     typeof(T).FullName, 
     typeof(T) == typeof(object)); 

    dynamic result = new ExpandoObject(); 
    result.Hello = "Hello"; 
    result.Number = 123; 

    try 
    { 
     return (T)result; 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("Can't cast dynamic to the generic type."); 
     return new T(); 
    } 
} 

生產:

類型是:System.Int32;等於對象:假。
不能將動態轉換爲泛型類型。
該類型是:System.Object;等於對象:對。
該類型是:System.Object;等於對象:對。

在泛型方法中,如何確定類型參數是動態還是普通對象?

回答

3

不,你不能。動態是所有人都看到的(意思是編譯器)。它是作爲動態執行。但是,您可以檢查IDynamicMetaObjectProvider:如果某個對象實現該功能,則調用者可能正在談論dynamic。不幸的是,反射也適用於dynamic,但根本不涉及IDynamicMetaObjectProvider

+1

謝謝。順便說一句,如果有一個傳遞給方法的泛型類型的參數,'IDynamicMetaObjectProvider'會很有用。在我的例子中,只有返回值使用泛型類型。 –

相關問題