C# .net DynamicObject实现,它为缺少的属性而不是RunTimeBinderException返回null

C# .net DynamicObject实现,它为缺少的属性而不是RunTimeBinderException返回null,c#,dynamic,C#,Dynamic,我希望能够做到以下几点: dynamic a = new ExpandoObject(); Console.WriteLine(a.SomeProperty ?? "No such member"); 但这会让你失望 RunTimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Throw' 您知道DynamicObject的一个实现,它会为缺少的定义返回null,或者是关于

我希望能够做到以下几点:

dynamic a = new ExpandoObject();
Console.WriteLine(a.SomeProperty ?? "No such member");
但这会让你失望

RunTimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Throw'
您知道DynamicObject的一个实现,它会为缺少的定义返回null,或者是关于如何创建一个定义的教程吗?非常感谢

像这样的

using System;
using System.Collections.Generic;
using System.Dynamic;

public class NullingExpandoObject : DynamicObject
{
    private readonly Dictionary<string, object> values
        = new Dictionary<string, object>();

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        // We don't care about the return value...
        values.TryGetValue(binder.Name, out result);
        return true;
    }

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

class Test
{
    static void Main()
    {
        dynamic x = new NullingExpandoObject();
        x.Foo = "Hello";
        Console.WriteLine(x.Foo ?? "Default"); // Prints Hello
        Console.WriteLine(x.Bar ?? "Default"); // Prints Default
    }
}
使用系统;
使用System.Collections.Generic;
运用系统动力学;
公共类NullingExpandoObject:DynamicObject
{
专用只读字典值
=新字典();
公共重写bool TryGetMember(GetMemberBinder绑定器,输出对象结果)
{
//我们不关心返回值。。。
value.TryGetValue(binder.Name,out结果);
返回true;
}
public override bool TrySetMember(SetMemberBinder绑定器,对象值)
{
值[binder.Name]=值;
返回true;
}
}
课堂测试
{
静态void Main()
{
动态x=新的NullingExpandooObject();
x、 Foo=“你好”;
Console.WriteLine(x.Foo???“默认”);//打印Hello
Console.WriteLine(x.Bar??“默认”);//打印默认值
}
}

我希望真正的
ExpandoObject
比这个复杂得多,但是如果这是您所需要的一切…

无论
值中的结果如何,都返回true。TryGetValue
可以抑制错误。谢谢你的回答,先生!很抱歉再次出现这种情况,但已经过了几年,这段代码仍然会产生两个RuntimeBinderException异常。我们有没有办法让它在每次访问时都不会触发异常?安东尼:你说的“生产”是什么意思?您的意思是说您在调试器中看到了它们,但随后它们被捕获了吗?@JonSkeet运行此(或任何类似)示例时,您没有看到在Visual Studio的控制台窗口中抛出并显示的异常吗?基于dynamicobject构建一个框架并发现每次访问您的属性包都会触发RubtimeBinderException,这一点都不好玩;这不仅会导致性能损失,而且会使控制台窗口变得杂乱无章。当然,我一定是做错了什么,但是当我看到Skeetmeister的代码也这么做时,我不禁想知道动力学出了什么问题。我可以理解在没有静态或动态属性的情况下(通过dynamicObjectTryxxx截取)抛出它,但是为了达到这个目的而构建一个类,比如DynamicObject,能够拦截并处理这些呼叫,并且发现即使你处理正确,你仍然会被抛出异常,这让杰克很伤心。没有别的办法吗?