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

mci*_*321 20 c# dynamic

我希望能够做类似以下的事情:

dynamic a = new ExpandoObject();
Console.WriteLine(a.SomeProperty ?? "No such member");
Run Code Online (Sandbox Code Playgroud)

但那会抛出

RunTimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Throw'
Run Code Online (Sandbox Code Playgroud)

您是否知道DynamicObject的实现将为缺少的定义返回null,或者有关如何创建一个的教程?非常感谢!

Jon*_*eet 34

像这样的东西?

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望真实ExpandoObject比这更复杂,但如果这就是你所需要的......