c# - 更改 System.Dynamic.ExpandoObject 默认行为

标签 c# asp.net expandoobject


我有一个使用 System.Dynamic.ExpandoObject() 创建的动态对象,现在在某些情况下某些属性可能不存在,如果尝试以这种方式访问​​这些属性

myObject.undefinedProperties;

对象的默认行为是抛出异常

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

是否可以更改此行为并在那种情况下返回空值?

最佳答案

如果您可以将 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

关于c# - 更改 System.Dynamic.ExpandoObject 默认行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33009741/

相关文章:

c# - 在 asp.net 中验证密码

c# - 来自集成测试的 ASP.NET Core UseSetting

c# - 将与字符串同名的属性添加到 ExpandoObject

c# - Process.start 在网络驱动器上,要求身份验证

c# - 在下拉列表控件中以编程方式设置默认文本

.net - 如何将 ExpandoObject 序列化为属性/值对?

c# - “ExpandoObject”不包含 'PropertyChanged' 的定义

c# - 具有 WsFederation 身份验证的 Owin 应用陷入无限重定向循环

c# - 无法使用 Autofac 解析 NameValueCollection

c# - 为什么私有(private)成员变量可以被类实例改变?