2015-09-02 38 views
0

假設通過反射(或使用動態)調用方法時,最安全的方法是選擇最具體的方法,如普通代碼中那樣?反射和動態方法解析

讓我們來考慮下面的代碼:

public class Animal {} 
public class Dog : Animal {} 

public class MyClass 
{ 
    public void SayHello(Dog animal) 
    { 
     Console.WriteLine("Hello dog!"); 
    } 

    public void SayHello(Animal animal) 
    { 
     Console.WriteLine("Hello animal!"); 
    } 
} 

當調用它:

var myClass = new MyClass(); 

// Classic invocation 
myClass.SayHello(new Dog()); 

// Reflection 
var method = myClass.GetType().GetMethod("SayHello", new[] { typeof(Dog) }); 
method.Invoke(myClass, new object[] { new Dog() }); 

// dynamic 
((dynamic)myClass).SayHello((dynamic)new Dog()); 

當調用SayHello是正確的方法調用使用傳統方法解決?換句話說,輸出將始終爲"Hello dog!"

從一個快速測試的答案似乎是,但我無法找到MSDN上的任何特定文檔。

+0

我想知道的最好方法就是自己試試,你已經有了代碼:) – Black0ut

回答

1

是的,dynamic總是將參數(在此例中爲new Dog())解析爲最具體的可能類型。