【发布时间】:2020-12-27 15:14:06
【问题描述】:
我尝试使用dynamic 访问位于另一个程序集中的类的方法。这些类是internal,由返回public 接口的构建器创建。由于某种原因dynamic 无法调用接口上定义的方法。我可以使用“经典”反射来运行代码,但我不明白为什么它不适用于 dynamic。
我知道dynamic 不使用内部类的方法,但这里我们有一个公共接口。那么请有人解释一下为什么dynamic 在下面的示例中抛出RuntimeBinderException?
namespace SandboxLib // located in SandboxLib.dll
{
public class InternalBuilder
{
public static IInterface Build()
{
return new InternalClass();
}
}
public interface IInterface
{
void IfMethod();
}
internal class InternalClass : IInterface
{
public void IfMethod() { }
}
}
namespace Sandbox // located in Sandbox.dll
{
public class Program
{
static void Main(string[] args)
{
var inst = InternalBuilder.Build();
dynamic dynInst = inst;
inst.IfMethod(); // ok
dynInst.IfMethod(); // Unhandled exception. Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a definition for 'IfMethod'
}
}
}
【问题讨论】:
-
它似乎并不关心接口,并试图访问实例化的内部类方法。我不得不想知道你为什么一开始就处于这种情况。
dynamic任何事情通常会导致比在最好的日子里解决的问题多 2 个问题 -
该应用程序是一个简单的检查工具,用于显示内部类提供的值。由于这些类是泛型类并且方法是
async方法,因此使用反射有点痛苦。在给定的位置,我不知道内部类有什么泛型类型,因此需要大量代码来提取值。但你是对的,通常我会尽量避免使用dynamic并尽可能选择显式类型。 -
不幸的是,这种情况是不允许的,反思也许是你唯一的选择。
标签: c# dynamic reflection