在进行了一些重构后遇到了一个有趣的运行时问题,并被归结为以下情况。
将动态对象的属性传递给从父接口继承的接口上的方法时,运行时绑定程序无法找到该方法。
这里有一个测试来证明失败和成功(当直接在父接口类型上调用方法时)
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);
}
}
}
测试 #1 失败:Assert.AreEqual 失败。预期:<(null)>。实际的:。“Test.Utility.IInheritEcho”不包含“EchoString”的定义
测试#2 成功。
我的问题是我关于第一次测试应该通过的假设是正确的,还是在框架中没有根本原因?
我知道我可以通过在传递参数时强制转换参数或在传递参数之前将它们分配给变量来解决这个问题。我只是好奇继承的接口导致 RuntimeBinder 失败的原因......