如何使用方法名称获取非静态MethodInfo(不在字符串中,不在类类型中搜索)

时间:2014-08-27 06:54:34

标签: c# reflection mono unity3d system.reflection

请考虑以下代码:

public class Test
{
    [System.AttributeUsage(System.AttributeTargets.Method)]
    class MethodAttribute : System.Attribute
    {
        public MethodAttribute(System.Reflection.MethodInfo methodInfo)
        {

        }
    }

    public void Foo()
    {

    }

    [Method(Test.Foo)] //< THIS IS THE IMPORTANT LINE
    public void Boo()
    {

    }
}

我想在Boo的属性中存储Foo的MethodInfo实例,但问题是,我不能使用FooTest.Foo来获取MethodInfo的实例。我可以使用typeof(Test).GetMethod("Foo")(不是我的决定)。

重要信息:

绝对不重要的信息:

  • 为什么我不能使用typeof(Test).GetMethod("Foo"):我不被允许。改变这个决定并不是我的权力。我可以。 (另外,就个人而言,无论如何我都想避免它,因为它需要进行一些查找而不是静态获取数据。在重构期间它也不会自动更改,而是检查运行时,而不是编译时。)
  • 为什么我要这样做:稍后在代码中,我想创建一个Boo()的委托(这次通常是一个实例)并在特殊的偶数系统或其他东西中使用。在调用之前,这个属性允许设置在准备主事件时调用的方法(它是可选的,它可以是null),并且我知道如何在有对象和方法信息时创建委托。
  • 为什么我不能在注册时提供两个代理或者其他东西:因为包含这些方法的类并不总是注册到事件源的类,我需要保持注册代码尽可能简单。换句话说,当人们编写负责连接forgots的方法来添加这个准备代表时,我想避免这种情况。

1 个答案:

答案 0 :(得分:0)

使用表达式:

static public class Metadata<T>
{
    static public PropertyInfo Property<TProperty>(Expression<Func<T, TProperty>> property)
    {
        var expression = property.Body as MemberExpression;
        return expression.Member as PropertyInfo;
    }
}

var foo = Metadata<Test>.Property(test => test.Foo);