我有一个类,让它命名为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
}
}
我可以使用此类的实例,如
dynamic blah = new DynamicBase();
Console.WriteLine(blah.FooProperty);
现在我还有一个Child Class调用DynamicChild,它在运行时编译并且应该访问动态属性。生成的类基本上看起来像这样:
public class DynamicChild: DynamicBase
{
public void DoSomeStuff()
{
Console.WriteLine(FooProperty)
}
}
是否可以编译此代码(因为DynamicBase实现了DynamicObject,会有一种访问FooProperty的机制)?
答案 0 :(得分:1)
不,不幸的是,这是不可能的。
继承DynamicObject
只会为类型添加一些额外的管道,以便它可以动态添加内容,这可以在动态上下文中使用。
但是,要实际使用动态添加的内容,您需要在动态上下文中使用该类型的对象。
您拥有的代码:
public void DoSomeStuff()
{
Console.WriteLine(FooProperty)
}
不使用dynamic
,因此不在动态上下文中,因此编译器将尝试静态编译。
强制动态上下文的唯一方法是转发dynamic
,@leppie在评论中说:
public void DoSomeStuff()
{
Console.WriteLine(((dynamic)this).FooProperty)
}