在 "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)
}
我有一个 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)
}