处理DynamicObject缺少成员的首选方法是什么?

时间:2016-07-29 16:34:06

标签: c# dynamic exception-handling

通常,当您覆盖/实施bool TryDoSomething(...)方法时,如果它不起作用,则返回false

如果DynamicObject我们返回false,它会抛出一个只包含一般错误消息的异常。

有关

public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)

它将是

  

无法调用非委托类型

就是这样。没有任何成员不起作用的信息也没有参数是什么。

改进,我只会抛出自己的异常,而不是返回false,因为它无论如何都会失败。

public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
    // ...
    throw new Exception($"Method '{binder.Name}' not found.");
    // ...
}

这是唯一/最佳方式吗?还是已经有其他东西?

这在某种程度上打破了TryDoSomething模式,但另一方面它会失败,所以为什么不呢?会破坏什么吗?

1 个答案:

答案 0 :(得分:0)

"尝试"的模式方法是返回bool并吞下异常。

也许最好在InvokeMember周围编写自己的包装器。您应该能够创建一个扩展方法来处理此

public static class Extensions
{
    public static object CustomInvokeMember(this Type t, string name, BindingFlags invokeAttr, Binder binder,
        object target, object[] args)
    {
        try
        {
            return t.InvokeMember(name, invokeAttr, binder, target, args);
        }
        catch (Exception e)
        {
            //TODO: parsing, custom handling, etc
        }
        return null;
    }
}