比较 MethodInfo 和 IMethodInvocation 中的方法
Comparing methods from MethodInfo and IMethodInvocation
我正在使用面向方面的编程来实现日志系统。因此,当调用方法时,我拦截该调用并进入该函数:
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() returns:
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)
有什么方法可以查明具体执行的方法是什么?
我发现的唯一方法是替换请求的通用参数并将它们与替换的通用类型进行比较:
t.GetMethods()[3].MakeGenericMethod(typeof(string)).ToString() ==
input.MethodBase.ToString()
我正在使用面向方面的编程来实现日志系统。因此,当调用方法时,我拦截该调用并进入该函数:
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() returns:
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)
有什么方法可以查明具体执行的方法是什么?
我发现的唯一方法是替换请求的通用参数并将它们与替换的通用类型进行比较:
t.GetMethods()[3].MakeGenericMethod(typeof(string)).ToString() ==
input.MethodBase.ToString()