Передача динамического параметра вызывает исключение 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 ...

Ответы на вопрос(2)

Ваш ответ на вопрос