c# - 如何检测和记录委托(delegate)方法签名中的参数名称和值?

标签 c# reflection dependency-injection

感谢您的关注!
背景
我有一个扩展方法,用于将给定的方法包装在 try/catch 中,并且我正在添加用于记录任何捕获的异常的代码:

 public static T HandleServerError<T>(this Func<T> func)
        {
            T result = default(T);
            try
            {
                result = func();
            }
            catch (Exception ex)
            {
                //******************************
                //Code for logging will go here.
                //******************************

                ErrorHandlers.ThrowServerErrorException(ex);
            }

            return result;
        }
以下是该方法的调用方式:
var result = new Func<SomeClass.SomeType>(() => SomeClass.SomeMethod(id, name, color, quantity)).HandleServerError();
return result;
如您所见,我调用的任何方法都被注入(inject)到扩展方法中并在 try/catch 中执行。
我们将使用 NLog 或 ELMAH 进行日志记录,但这在很大程度上与这个问题无关。
问题
如果出现问题,我需要尽可能多地记录有关委托(delegate)方法的信息,因为诸如“未将对象引用设置为对象的实例”之类的内容本身并没有帮助。
我想记录被调用方法的类和名称以及方法签名中的参数及其值。如果可能的话,我什至想记录哪一行失败,最后是实际的堆栈跟踪。
我猜我需要为此使用反射,并且可能会在注入(inject)的方法执行时以某种方式捕获绑定(bind)标志,但我不完全确定这是否是最好的方法,或者它是否可行。
问题
使用 C#,如何获取有关注入(inject)/委托(delegate)方法的元信息(即方法名称、来源类、参数、参数值)?
提前致谢。

最佳答案

您可以简单地访问其 MethodTarget 属性,因为它基本上是任何其他委托(delegate)。

只需使用 func.Methodfunc.Target

关于c# - 如何检测和记录委托(delegate)方法签名中的参数名称和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310550/

相关文章:

c# - viewstate 在 response.redirect 上消失

Java反射 'Can not set'错误

c# - 为适当的构造函数注入(inject)和 ISP(SOLID)定义抽象

java - 使用 @autowired 将 session bean 注入(inject) Web 服务端点

c# - 使用 MarshalByRefObject 有什么副作用吗?

javascript - 检查 RadListView ItemTemplate 中的 RadButton 复选框 - 客户端

c# - 如何将 32 位图像添加到 Visual Studio 2017 WPF 应用程序的图标?

java - 如何使用反射获取字段的值?

c# - 获取 Enumerable.DefaultIfEmpty 的方法信息

java - Android - Dagger 不生成 DaggerModelComponent.create()