对于问题的解释不好而感到抱歉
完全重写问题
我有以下方法:
public TReturn FindCached<TSearch, TReturn>(Func<TSearch, TReturn> searchMethod)
where TSearch : ISearchSpecification
where TReturn : class
{
SearchSpecification spec = new GetConcreteSearchSpecification<TSearch>();
//insert magic here to get an attribute from the method on
//the spec class that searchMethod invokes on the line below
return searchMethod(spec);
}
所以我有一个委托(searchMethod
)和一个我想要调用委托的对象(spec
)。我想检查对象(spec
)以找到searchMethod在调用时将调用的方法的自定义属性。
希望这更清楚。
由于
答案 0 :(得分:1)
假设您认为searchMethod
是Func<TSearch, TReturn>
和mySearchSpec
类型的变量作为ISearchSpecification<TSearch>
的某些实现,那么您基本上就是在如何获取类的属性
为此,请使用以下内容:
object[] attrs = typeof(mySearchSpec).GetCustomAttributes(false);
假设mySearchSpec
类型是公开的,否则您可能需要GetCustomAttributes
的不同重载
<强>附录强>:
根据您修改过的问题,获取方法的属性,使用spec
的实际类型:
Type t = spec.GetType();
MethodInfo m = t.GetMethod("nameOfMethodToBeCalledHere");
object[] attrs = m.GetCustomAttributes(false);
再次注意,您可能需要GetMethod
或GetCustomAttributes
的重载,具体取决于实际类的实现。
注意:强>
但是,您似乎可能会要求return searchMethod(spec);
中调用的方法,但这只是searchMethod
而不是spec
上的某种方法。
如果您想要searchMethod
上的属性(与spec
无关):
MethodInfo m = searchMethod.Method;
object[] attrs = m.GetCustomAttributes(false);
我认为现在涵盖了所有意义的排列......
答案 1 :(得分:0)
这是一个令人困惑的问题,让我们看看我是否正确:
searchMethod
的lambda函数(您将其描述为委托)。spec
所以你有一个像这样的方法:
[MyCustomAttribute]
public RetClass MyMethod( SearchSpecification input ) {
return input.GetRetClass();
}
您可以使用以下方法调用此方法:
var result = FindCached( MyMethod );
在FindCached
中你想找到MyCustomAttribute
- 在这种情况下,@ jerryjvl的答案是正确的。
你的问题是你也可以这样做:
var result = FindCached( x => x.GetRetClass() );
我不能从您的描述中确定这是您真正想要的x.GetRetClass()
的属性。在这种情况下,您需要使用表达式将lambda分开,但我不建议它 - 更复杂的lambda声明将导致匿名委托,当您尝试在运行时解析它时,这是一个黑盒子。 / p>
相反,当您正在使用反射时,可能更容易传递您想要的方法的名称而不是委托引用:
var result = FindCached( "GetRetClass" );
答案 2 :(得分:0)
我遇到了类似的情况,jerryjvl的回答完全解释了我想要的东西。
我想创建一个通用的分析方法,我可以计算一些方法运行的时间,并使用反射检索方法的名称以进行日志记录。
MethodInfo是关键。
我的方法如下:
public static bool TimeMethod(Func<bool> someMethod)
然后我想动态地获取它的名字或一些属性。
MethodInfo m = someMethod.Method;
object[] attrs = m.GetCustomAttributes(typeof(MonitoringDescriptionAttribute), true);
string name = m.Name;
干杯