изменить систему.Активный.Поведение по умолчанию ExpandoObject
У меня есть динамический объект, созданный с помощью System.Активный.ExpandoObject (), теперь в некоторых случаях некоторые свойства не могут существовать, и если попытаться получить доступ к ним таким образом
myObject.undefinedProperties;
Поведение объекта по умолчанию состоит в том, чтобы вызвать исключение
'System.Dynamic.ExpandoObject' does not contain a definition for 'undefinedProperties'
Можно ли изменить это поведение и вернуть в этом случае нулевое значение?
3 ответа:
Если бы вы могли заменить
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
ExpandoObject наследует IDictionary
, поэтому вы можете проверить, имеет ли объект "undefinedProperties", как это if (((IDictionary<string, object>)myObject).ContainsKey("undefinedProperties")) { // Do something }
Вы можете проверить существование свойства в ExpandoObject, смотрите здесь обнаружение свойства в ExpandoObject