Подтвердить что ты не робот

.net DynamicObject, которая возвращает значение null для отсутствующих свойств, а не исключение RunTimeBinderException

Я хотел бы сделать что-то вроде следующего:

dynamic a = new ExpandoObject();
Console.WriteLine(a.SomeProperty ?? "No such member");

но это бросает

RunTimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Throw'

Знаете ли вы о реализации DynamicObject, который возвращает null для отсутствующих определений или учебник о том, как его создать? Большое спасибо!

4b9b3361

Ответ 1

Что-то вроде этого?

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
    }
}

Я ожидаю, что реальный ExpandoObject будет более сложным, чем это, но если это все, что вам нужно...