C # 4.0: динамический указатель this - PullRequest
1 голос
/ 01 октября 2009

Можно ли разрешить методы и свойства указателя 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 ]

6 голосов
/ 01 октября 2009

Нет, у вас не может быть динамического базового класса. Помимо всего прочего, система все еще должна знать, сколько места выделяется при создании нового экземпляра вашего класса.

Не могли бы вы объяснить, чего вы пытаетесь достичь? Вполне возможно, что dynamic поможет без такого поведения.

РЕДАКТИРОВАТЬ: Хорошо, увидев ваше редактирование - я не думаю, что вы можете делать то, что вы хотите, но если вы просто используете

dynamic dmc = this;
dmc.MyProperty = value;

или

((dynamic)this).MyProperty = value;

Обойти это должно быть хорошо. Другими словами: ссылка this всегда статически типизирована, но вы можете иметь выражение со значением , равным this, но с динамическим типом.

Это не должно быть слишком обременительно, если вы не выполняете lot динамической работы - в этом случае я бы рекомендовал вместо этого использовать полностью динамический язык. Если вы реализуете большую часть своего динамического кода в IronPython / IronRuby, вы все равно можете легко интегрировать его с вашим кодом C #.

0 голосов
/ 01 октября 2009

Я понимаю, что это касательная, но есть языки , где суперкласс каждого класса является динамическим, т. Е. Разрешение имени класса является виртуальным и может переопределяться.

0 голосов
/ 01 октября 2009

Как насчет этого:

    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);
        }
    }
0 голосов
/ 01 октября 2009

Это основа полиморфизма. Вызванный метод / свойство будет самым низким в иерархии типа объектов.

...