Подклассы DynamicObject в C # 4.0? - PullRequest
0 голосов
/ 27 августа 2009

Я тестировал некоторые новые вещи в VS 2010 и C # 4.0, и немного старался, чтобы увидеть его границы, и пока мне нравится то, что я вижу, но одна вещь меня немного раздражен ...

Учитывая следующие два простых класса, есть ли какой-нибудь способ (кроме прямого вызова TryGetMember), чтобы избежать приведения к dynamic? Возможно, какой-то магический атрибут, который можно установить на Test?

class DynamicPropertyObject : DynamicObject
{
    private Dictionary<string, object> _properties = new Dictionary<string, object>();

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        foreach (string s in _properties.Keys)
            yield return s;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        _properties[binder.Name] = value;
        return true;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = null;
        if (!_properties.ContainsKey(binder.Name))
            return false;

        result = _properties[binder.Name];
        return true;
    }
}

class Test : DynamicPropertyObject
{
    public Test()
    {
        ((dynamic)this).Foo = "test";
    }
}

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

Я подозреваю, что вам нужно преобразовать в dynamic, чтобы компилятор мог преобразовать доступ к свойству в класс TryGetMember.

Редактировать:

Поскольку .NET и C # не являются точно динамическими и не предназначены для того, чтобы всегда иметь позднюю привязку (кроме виртуальных членов), необходимо явно указать, что вы хотите динамическую типизацию, когда вы это делаете. Между ними нет: статически типизированный объект var, который действует как динамически типизированный, когда компилятор не может найти член во время компиляции.

1 голос
/ 27 августа 2009

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

private dynamic DynThis { get { return this; } }

и используйте его вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...