由于各种原因,我需要运行如下所示的代码:
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
的正文中,使用反射来查看MyAttribute
上MyClass.SayHello
类的参数。但是,我不确定如何到达那里。我只能使用反射看到的是lambda表达式本身,而不是它的内容。
答案 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)
。