изменить систему.Активный.Поведение по умолчанию ExpandoObject



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

myObject.undefinedProperties;

Поведение объекта по умолчанию состоит в том, чтобы вызвать исключение

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

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

3 3

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