.Net 3.5 DLR DynamicObject Help - PullRequest
       20

.Net 3.5 DLR DynamicObject Help

3 голосов
/ 25 февраля 2010

Я изо всех сил пытался получить простой пример DynamicObject, работающий в .NET 3.5.

Используя последнюю версию DLR off codeplex, я не смог выяснить, что такое .NET 3.5, эквивалентный следующему:

public class DynamicObjectBag : DynamicObject
{
    private Dictionary<string, object> _properties = new Dictionary<string, object>();
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        return _properties.TryGetValue(binder.Name, out result);
    }

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

dynamic foo = new DynamicObjectBag();
foo.Val1 = 3;
foo.Val2 = “Value 2”;

Это, конечно, упрощенный пример. Я планирую извлечь классы из DynamicObject, чтобы иметь возможность использовать как прямые свойства объекта, так и свойства, хранящиеся в словаре, используя те же обозначения в стиле семантической точки или методы доступа. Цель состоит в том, чтобы иметь совместимые с DLR объекты для использования на языках, поддерживаемых DLR, и обеспечить будущую совместимость с возможностями DLR .NET 4.0, когда приложение можно будет обновить до .NET 4.0.

Моя проблема в том, что до .NET 4.0 у меня нет эквивалента концепции динамического ключевого слова. Такие методы, как TryGetMember, имеют параметр связывания, такой как GetMemberBinder. В настоящее время в .NET 4.0 доступно связывание по умолчанию на C #, что позволит связывать его при использовании ключевого слова dynamic, однако мне не удалось найти или определить, как выполнить аналог в .NET 3.5.

На данный момент я понимаю, что мне нужно написать собственный механизм связывания, который бы в основном дублировал тип логики, доступный в связывателе C # по умолчанию для .NET 4.0.

Пожалуйста, кто-нибудь указывает мне правильное направление, как я могу использовать DynamicObject в .NET 3.5 и добавлять свойства и т. Д. Во время выполнения без доступа к динамическому ключевому слову.

Ссылки:
Динамическое добавление членов к динамическому объекту
http://tomlev2.wordpress.com/2009/10/08/c-4-0-implementing-a-custom-dynamic-object/

1 Ответ

2 голосов
/ 25 февраля 2010

Вам нужно будет создать пользовательское связующее, и вы, вероятно, захотите использовать связующее, используя CallSite, чтобы кэшировать действия.

Вы можете использовать DefaultBinder во внешнем слое, чтобы сделать большую часть этого - вам просто нужно создать его, а затем у него есть методы, такие как GetMember, для выполнения связывания. В этом случае реализация вашего связующего просто использует DefaultBinder и применяет любые правила для возвращаемых типов значений бокса (DLR требует, чтобы все возвращаемые типы были объектами).

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