比较MethodInfo和IMethodInvocation的方法

时间:2017-03-16 15:49:50

标签: c# reflection aop interception methodinfo

我正在使用面向方面的编程来实现日志系统。因此,当调用该方法时,我拦截该调用并进入该函数:

    private IEnumerable<ILogMessage> GetLogMessageFromAttribute(IMethodInvocation input)
    {
        List<ILogMessage> messages = new List<ILogMessage>();
        var t = input.Target.GetType();
        var method = t.GetMethods()
                    .FirstOrDefault(m => m.ToString() == input.MethodBase.ToString());

        if (method != null)
        {
            var attributes = method.CustomAttributes
                             .Where(atr => atr.AttributeType == typeof(LogAttribute));

            foreach (var atr in attributes)
            {
                var logAttributeInstance =
                    (LogAttribute)Attribute.GetCustomAttribute(method, typeof(LogAttribute));

                messages.Add(MethodInfoTools.FillParametersDataInLogMessage(method, input,
                    logAttributeInstance.LogMessage));
            }
        }

        return messages;
    }

方法可以通过自己的名称进行比较,但可以重载,并且这些方法的属性可以不同。

var method = t.GetMethods()
                .FirstOrDefault(m => m.ToString() == input.MethodBase.ToString());

这种方式很好,直到我试图用泛型拦截方法。在这种情况下.ToString()返回:

System.String TestMethod2[String](System.Collections.Generic.IEnumerable`1[System.String], System.String)

System.String TestMethod2[T](System.Collections.Generic.IEnumerable`1[System.String], T)

有没有办法找出执行的确切方法?

1 个答案:

答案 0 :(得分:0)

我找到的唯一方法是替换请求的泛型参数并将其与替换的泛型类型进行比较:

t.GetMethods()[3].MakeGenericMethod(typeof(string)).ToString() ==
                  input.MethodBase.ToString()