C#通过反射从具体类中获取Delegate(Func)实现?

时间:2009-06-02 12:49:11

标签: c# attributes delegates

对于问题的解释不好而感到抱歉

完全重写问题

我有以下方法:

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在调用时将调用的方法的自定义属性。

希望这更清楚。

由于

3 个答案:

答案 0 :(得分:1)

假设您认为searchMethodFunc<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);

再次注意,您可能需要GetMethodGetCustomAttributes的重载,具体取决于实际类的实现。

注意:
但是,您似乎可能会要求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;

干杯