2015-09-02 4 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()) до максимально возможного типа.

Смежные вопросы