Passar um parâmetro dinâmico gera RuntimeBinderException ao chamar o método da interface herdada
Corri para um problema de tempo de execução interessante após algumas refatorações e fixei-o na seguinte situação.
Ao passar uma propriedade de um objeto dinâmico para um método em uma interface que foi herdada de uma interface pai, o fichário de tempo de execução não pode encontrar o método.
Aqui está um teste para demonstrar a falha e o sucesso (ao chamar o método diretamente no tipo de interface pai)
<code>using System.Dynamic; using Microsoft.CSharp.RuntimeBinder; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Test.Utility { public interface IEcho { string EchoString(string input); } public interface IInheritEcho : IEcho { } public class EchoClass : IInheritEcho { public string EchoString(string input) { return input; } } [TestClass] public class RuntimeBinderTest { [TestMethod] public void RuntimeBinder_should_work_when_dynamic_parameters_are_passed_to_method_from_inherited_interface() { //Arrange dynamic dynObject = new ExpandoObject(); dynObject.Foo = "Bar"; IInheritEcho echomore = new EchoClass(); string echo = null; string exceptionMessage = null; //Act try { echo = echomore.EchoString(dynObject.Foo); } catch (RuntimeBinderException e) { exceptionMessage = e.Message; } //Assert Assert.AreEqual(echo, dynObject.Foo, false, exceptionMessage); } [TestMethod] public void RuntimeBinder_should_work_when_dynamic_parameters_are_passed_to_method_from_noninherited_interface() { //Arrange dynamic dynObject = new ExpandoObject(); dynObject.Foo = "Bar"; IEcho echomore = new EchoClass(); string echo = null; string exceptionMessage = null; //Act try { echo = echomore.EchoString(dynObject.Foo); } catch (RuntimeBinderException e) { exceptionMessage = e.Message; } //Assert Assert.AreEqual(echo, dynObject.Foo, false, exceptionMessage); } } } </code>
Falha no teste 1: Assert.AreEqual falhou. Esperado: <(null)>. Real:. 'Test.Utility.IInheritEcho' não contém uma definição para 'EchoString'
Teste # 2 é bem sucedido.
A minha pergunta é se a minha suposição de que o primeiro teste deve passar está correta ou se existe uma razão fundamental na estrutura que não está correta?
Eu sei que posso corrigir o problema, lançando os parâmetros quando eu passá-los ou atribuí-los a variáveis antes de passá-los dentro Estou mais curioso apenas a razão pela qual a interface herdada está causando o RuntimeBinder a falhar ...