Se ejecutó en un problema de tiempo de ejecución interesante después de algunas refactorizaciones y se ha incluido en la siguiente situación.Al pasar un parámetro dinámico lanza RuntimeBinderException al llamar al Método desde la interfaz heredada
Al pasar una propiedad de un objeto dinámico a un método en una interfaz que se ha heredado de una interfaz principal, el archivo de tiempo de ejecución no puede encontrar el método.
Aquí está una prueba para demostrar tanto fracaso y el éxito (al llamar directamente al método del tipo de interfaz padres)
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);
}
}
}
Prueba # 1 se produce un error: Assert.AreEqual falló. Esperado: < (nulo)>. Real:. 'Test.Utility.IInheritEcho' no contiene una definición para 'EchoString'
Prueba # 2 Sucede.
Mi pregunta es si mi suposición de que la primera prueba debe pasar es correcta o hay una razón fundamental en el marco que no lo es?
Sé que puedo solucionar el problema lanzando los parámetros cuando los transfiero o los asigno a variables antes de pasarlos. Tengo más curiosidad por el motivo por el que la interfaz heredada está causando la falla de RuntimeBinder. ..
tienes toda la razón. (Aunque es de una versión anterior de C#: http://msdn.microsoft.com/en-us/library/aa664578%28VS.71%29.aspx) Debe haber una falla. ¿Qué sucede si utiliza una clase normal con una propiedad de cadena en lugar del objeto expando? ¿Encuentra el método en la interfaz heredada? (No tengo VS aquí para hacer la prueba yo mismo). Si fue con enlace estático (enlace de tiempo de compilación), entonces hay algo mal con el enlace dinámico (cuaderno de tiempo de ejecución). – JotaBe
El uso de una clase regular con una propiedad de cadena pasa como se esperaba. Definitivamente es la carpeta de tiempo de ejecución que no se está comportando ... – piff
Si mira el enlace de respuesta de igofed a Microsof Connect, este error es conocido y probablemente no se resolverá en la nueva versión VS. – JotaBe