处理缺少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
模式,但另一方面它无论如何都会失败,为什么不呢?它会打碎什么东西吗?
"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;
}
}