2015-10-08 5 views
3


Я динамический объект, созданный с помощью System.Dynamic.ExpandoObject(), в настоящее время в некоторых случаях некоторые свойства могут не существует, и если попытаться получить доступ к тем, таким образомИзменение System.Dynamic.ExpandoObject поведение по умолчанию

myObject.undefinedProperties; 

поведение по умолчанию объекта бросить исключение

'System.Dynamic.ExpandoObject' does not contain a definition for 'undefinedProperties' 

можно изменить это поведение и вернуться в этом случае нулевое значение?

ответ

4

Если вы могли бы заменить ExpandoObject на DynamicObject, вы можете написать собственный класс, который соответствует вашим требованиям:

public class MyExpandoReplacement : DynamicObject 
{ 
    private Dictionary<string, object> _properties = new Dictionary<string, object>(); 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if (!_properties.ContainsKey(binder.Name)) 
     { 
      result = GetDefault(binder.ReturnType); 
      return true; 
     } 

     return _properties.TryGetValue(binder.Name, out result); 
    } 

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

    private static object GetDefault(Type type) 
    { 
     if (type.IsValueType) 
     { 
      return Activator.CreateInstance(type); 
     } 
     return null; 
    } 
} 

Использование:

dynamic a = new MyExpandoReplacement(); 
a.Sample = "a"; 

string samp = a.Sample; // "a" 
string samp2 = a.Sample2; // null 
+0

Спасибо так много, вы решили мой день !!! – davidinho

+0

Тип, переданный в GetDefault (тип типа), по-видимому, всегда является «объектом» и никогда не спускается в ветви type.IsValueType. Зачем? – WillC

2

ExpandoObject наследует IDictionary < строку, объект>, так что вы можете проверить, если объект имеет «undefinedProperties» как этот

if (((IDictionary<string, object>)myObject).ContainsKey("undefinedProperties")) 
{ 
    // Do something 
} 
Смежные вопросы