是否可以动态解析'this'指针的方法和属性?
换句话说,一个类可以有一个动态超类吗?
澄清
我希望能够继承某些类,并访问未在编译时定义的属性和方法。
class MyClass : DynamicObject
{
public void ReceiveValue(object value) {
MyProperty = value;
}
}
DynamicObject
为我的代码提供了一种方法,可以通过上面的参数set_MyProperty
通知value
,是吗?我知道如果您使用如下语法,这是可能的:
var mc = new MyClass();
...
dynamic dmc = mc;
dmc.MyProperty = value;
但是我希望能够在MyClass的方法中做到这一点,就像我做的那样:
dynamic dmc = this;
dmc.MyProperty = value;
DynamicObject
是否涵盖了我?
答案 0 :(得分:6)
不,你不能拥有动态基类。除此之外,系统仍然需要知道在创建类的新实例时要分配多少空间。
你能解释一下你想要实现的目标吗? dynamic
可能有很多方法可以帮助您,而不需要这种行为。
dynamic dmc = this;
dmc.MyProperty = value;
或
((dynamic)this).MyProperty = value;
解决方法应该没问题。换句话说:this
引用始终是静态类型的,但您可以使用this
的值但具有动态类型的表达式。
除非你正在进行动态工作的很多,否则这不应该太繁琐 - 在这种情况下,我建议你使用完全动态的语言。如果您在IronPython / IronRuby中实现了大量动态代码,那么无论如何都可以轻松地将它与C#代码集成。
答案 1 :(得分:0)
这是多态性的基础。调用的方法/属性将是对象类型的层次结构中给定最低的方法/属性。
答案 2 :(得分:0)
这个怎么样:
class B
{
public void M(object o)
{
dynamic i = this;
i.P = o;
}
}
class D : B
{
public object P { get; set; }
}
class Program
{
static void Main()
{
var d = new D();
d.M(1);
}
}
答案 3 :(得分:0)
我意识到这是一个切线,但是there are languages其中每个类的超类都是动态的 - 即类名解析是虚拟的并且可以覆盖。