在 "this" 上访问动态成员

Accessing Dynamic Members on "this"

我有一个 class,我们将其命名为 DynamicBase,它看起来基本上是这样的:

public class DynamicBase: DynamicObject
{
    public override bool TryGetMember(System.Dynamic.GetMemberBinder binder, out object result)
    {
         // doing some magic stuff here, to read Dynamic Properties from this object
    }
}

我可以使用这个 class 的实例,例如

dynamic blah = new DynamicBase();
Console.WriteLine(blah.FooProperty);

现在我还有一个子 Class 调用 DynamicChild,它在运行时编译并且应该访问动态属性。生成的 class 基本上看起来像这样:

public class DynamicChild: DynamicBase
{
    public void DoSomeStuff()
    {
        Console.WriteLine(FooProperty)
    }
}

是否可以编译此代码(由于 DynamicBase 实现了 DynamicObject,因此会有一种访问 FooProperty 的机制)?

不,很遗憾,这是不可能的。

DynamicObject 继承只为类型添加一些额外的管道,以便它可以动态添加东西,可以在动态上下文中使用。

但是,要实际使用那些动态添加的东西,您需要在动态上下文中使用该类型的对象。

您拥有的密码:

public void DoSomeStuff()
{
    Console.WriteLine(FooProperty)
}

不使用 dynamic,因此不在动态上下文中,因此编译器将尝试静态编译它。

强制动态上下文的唯一方法是转换为 dynamic,正如 @leppie 在他的评论中所说:

public void DoSomeStuff()
{
    Console.WriteLine(((dynamic)this).FooProperty)
}