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

本文关键字:方式 是什么 成员 DynamicObject 处理 | 更新日期: 2023-09-27 17:59:11

通常在重写/实现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模式,但另一方面它无论如何都会失败,为什么不呢?它会打碎什么东西吗?

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

"Try"方法的模式是返回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;
    }
}