gpt4 book ai didi

c# - 为什么在内部类上 C# 动态找不到接口(interface)的方法?

转载 作者:行者123 更新时间:2023-12-04 12:58:02 27 4
gpt4 key购买 nike

我尝试使用 dynamic访问位于另一个程序集中的类的方法。这些类是 internal并由返回 public 的构建器创建界面。出于某种原因dynamic无法调用接口(interface)上定义的方法。我可以使用“经典”反射来运行代码,但我不明白为什么它不能用于 dynamic .
我知道dynamic不使用内部类的方法,但在这里我们有一个公共(public)接口(interface)。所以请有人解释为什么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'
}
}
}

最佳答案

C# 标准中描述了此行为:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#dynamic-binding
在“成员查找”下,它指出:

Member lookup considers not only the name of a member but also thenumber of type parameters the member has and whether the member isaccessible.


自成员(member) IfMethod() dynamic找到的分辨率是 internal ,根据规范,调用将失败。

关于c# - 为什么在内部类上 C# 动态找不到接口(interface)的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63807380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com