如何找到lambda表达式调用的方法的属性?

时间:2014-10-22 19:37:06

标签: c# reflection lambda attributes

由于各种原因,我需要运行如下所示的代码:

public class MethodRunner {
     public T RunMethod<T>(Func<T> method) {
          method.Invoke();
     }
}

我有一个具有自定义属性的类,如下所示:

public class MyClass {
     [MyAttribute("somevalue")]
     public string SayHello(string message) {
         Console.WriteLine(message);
         return message;
     }
}

然后我可以通过编写

来呼叫MyClass.SayHello
var runner = new MethodRunner();
var myClass = new MyClass();

runner.RunMethod(() => myClass.SayHello("hello!"));

我想要做的是,在MethodRunner.RunMethod的正文中,使用反射来查看MyAttributeMyClass.SayHello类的参数。但是,我不确定如何到达那里。我只能使用反射看到的是lambda表达式本身,而不是它的内容。

1 个答案:

答案 0 :(得分:0)

如果您能够将Func<T>更改为Expression<Func<T>>,则很容易。

如果可能的话,这是一个例子:

public class MethodRunner {
     public T RunMethod<T>(Expression<Func<T>> method) {
          var body = method.Body as MethodCallExpression;
          if (body == null)
              throw new NotSupportedException();

           var attributes = body.Method.GetCustomAttributes(false);

           // Do something with Attributes

           return expression.Compile().Invoke();
     }
}

Func<T>() =>一起使用时的困难在于编译器将生成实际方法。据我所知,你不能从方法中获取代码的“行”。由于您有参数,这种方法无法帮助您使用RunMethod(myClass.SayHello)代替RunMethod(() => myClass.SayHello)