【问题标题】:C# Late Binding and dynamic keyword won't work togetherC# 后期绑定和动态关键字不能一起工作
【发布时间】:2012-10-12 06:38:37
【问题描述】:

我正在尝试遵循 Pro C# 5.0 一书中的示例,但我偶然发现了一个我无法工作的示例:

static void Main() {

    Assembly asm = Assembly.Load("CarLibrary");

    Type MiniVan = asm.GetType("CarLibrary.MiniVan");

    dynamic d = Activator.CreateInstance(Minivan);

    Console.WriteLine("Type of d is {0}", d.GetType()); // Type is CarLibrary.MiniVan

    MethodInfo m = MiniVan.GetMethod("TurboBoost");
    m.Invoke(d, null); // This works fine, and prints out "Turbo Boosting"

    d.TurboBoost(); // This doesn't work like the book says it should. 
                    // I get: object does not contain a definition for TurboBoost;

这是 CarLibrary 的声明:

namespace CarLibrary {

    // UPDATE: I just realized that I had declared MiniVan internal
    internal MiniVan {

        public void TurboBoost() {

            Console.WriteLine("Turbo Boosting");
        }
    }
}

因此,即使 MiniVan 被声明为 INTERNAL,使用反射我仍然可以创建 MiniVan 的实例,并调用 TurboBoost()。但是,如果我使用 dynamic 关键字,则对 TurboBoost() 的调用将不起作用。如果 MiniVan 被声明为 PUBLIC,那么这两种情况都可以完美运行。

谁能告诉我这一切是否如想象的那样?

【问题讨论】:

  • 您可以通过反射访问私有成员(您可以使用BindingFlags 调整行为)。所以是的,一切都很好。

标签: c# dynamic reflection late-binding


【解决方案1】:

dynamic尊重可访问性规则,其中不仅包括成员的可访问性,还包括对象的类型是否为internalprivate(嵌套)等。dynamic不是只是 em> 一个围绕反射的包装器 - 它更多:这在常规 C# 中是否可以从这里工作

这意味着 dynamic CarLibrary 程序集内执行的相同用法 会起作用。如果您想通过dynamic 访问类型成员,那么它必须是public,或者至少:在调用上下文中可访问。

特别是,这可以防止您通过访问internal 类型的public 成员来欺骗运行时,而您不应该直接知道。例如,假设一个核心 CLI 类型实现了某个接口:

public ISomeInterface {...}
internal SomeMicrosoftType : ISomeInterface
{
    public void FireTheMissiles() {...}
}

现在;很可能有一个 API 将该对象公开为一个ISomeInterface 实例 - 所以我们可以合法地引用该对象。在我们的常规代码中,我们可以访问ISomeInterface 的成员,但我们无法调用FireTheMissiles。但是,如果您的建议有效,那么我们可以这样做:

ISomeInterface innocent = ...
dynamic evil = innocent;
evil.FireTheMissiles();

现在,是的,我们可以通过 reflection 做到这一点,但是反射有额外的检查,尤其是在我们没有完全信任的情况下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2014-07-02
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多