C#4.0:动态'this'指针

时间:2009-10-01 06:46:48

标签: c# dynamic c#-4.0

是否可以动态解析'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是否涵盖了我?

4 个答案:

答案 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其中每个类的超类都是动态的 - 即类名解析是虚拟的并且可以覆盖。