Передача динамического параметра вызывает исключение RuntimeBinderException при вызове метода из унаследованного интерфейса.
После некоторого рефакторинга возникла интересная проблема во время выполнения, которая привела к следующей ситуации.
При передаче свойства из динамического объекта в метод интерфейса, который был унаследован от родительского интерфейса, средство связывания во время выполнения не может найти метод.
Вот тест для демонстрации как неудачи, так и успеха (при вызове метода непосредственно в родительском типе интерфейса)
<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>
Тест № 1 не пройден: Assert.AreEqual не удалось. Ожидаемое: & Lt; (нуль) & GT ;. Фактические :. & APOS; Test.Utility.IInheritEcho & APOS; не содержит определения для «EchoString»
Тест № 2 Успешен.
Мой вопрос заключается в том, верно ли мое предположение о том, что 1-й тест должен пройти, или в рамках есть фундаментальная причина, по которой он не проходит?
Я знаю, что могу решить эту проблему, приведя параметры, когда я передаю их, или назначая их переменным перед их передачей. Мне просто любопытно, почему унаследованный интерфейс вызывает сбой RuntimeBinder ...