2015-03-12 3 views
1

У меня есть прецедент, где мне нужно будет добавлять свойства к динамическому объекту в C# при чтении, в отличие от записи. То есть что-то вроде этого:Динамически добавлять свойство на чтение-доступ к DynamicObject или ExpandoObject

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

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if (!_properties.TryGetValue(binder.Name, out result) 
     { 
      result = object(); 
      _properties.Add(binder.Name, result); 
     } 
     return true; 
    } 
} 

class Test 
{ 
    public void Bar() 
    { 
     var o = new Foo(); 
     // Fails! 
     var prop = o.SomeProperty; 
    } 
} 

Конечная цель - использовать эту прокладку в выражениях LINQ. Я действительно не забочусь о возвращаемом значении, все, что я хочу, - это удобный способ для записи записи того факта, что к этому свойству был доступ, а затем использовать его позже при проверке дерева выражений.

Возможно ли это с помощью C#?

ответ

2

Я действительно не вижу проблемы здесь. Пробовал это и результат вполне ожидался: Просто добавлено Недвижимость property to get actual dictionary;

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

    public Dictionary<string, object> Properties { 
     get { return _properties; } 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) { 
     if (!_properties.TryGetValue(binder.Name, out result)) { 
      result = new object(); 
      _properties.Add(binder.Name, result); 
     } 
     return true; 
    } 
} 

в настоящее время использование:

dynamic o = new Foo(); 
var prop = o.SomeProperty; 
var prop2 = o.SomeNewProperty; 
var allAccessedPropNames = o.Properties.Keys; 

И allAccessedPropNames приведет, как { "SomeProperty", "SomeNewProperty"}

Если удалить Добавить линию от TryGetMember то это приводит к пустой коллекции.

+1

Спасибо, глупо, что я забыл ключевое слово 'dynamic' по использованию ... –

Смежные вопросы