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

C# 如何使用方法名(不在字符串中,不在类类型中搜索)获取非静态MethodInfo,c#,reflection,mono,unity3d,system.reflection,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

考虑以下代码:

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()
    {

    }
}
公共类测试
{
[System.AttributeUsage(System.AttributeTargets.Method)]
类MethodAttribute:System.Attribute
{
公共MethodAttribute(System.Reflection.MethodInfo MethodInfo)
{
}
}
公共图书馆
{
}
[方法(Test.Foo)]/<这是重要的一行
公共图书馆
{
}
}
我想在Boo的属性中存储Foo的MethodInfo实例,但问题是,我不能使用
Foo
Test.Foo
来获取
MethodInfo
的实例。我不能使用
typeof(Test).GetMethod(“Foo”)
(不是我的决定)

重要信息:

  • 生成的错误为:错误CS0120:访问非静态成员“Test.Foo()”需要对象引用
  • 我用的是Unity3D,它使用的是Mono,而不是.Net。(更多信息)
  • 视窗7
绝对不重要的信息:

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

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);
静态公共类元数据
{
静态公共属性信息属性(表达式属性)
{
var expression=property.Body作为MemberExpression;
返回表达式.Member作为PropertyInfo;
}
}
var foo=Metadata.Property(test=>test.foo);

我不确定,但我认为属性只能包含编译常量值,所以在内部使用反射不会编译。指向MethodInfo的指针不是常量吗?我的意思是,它不是Python,不能在类中更改指向方法的指针。只有当它是虚拟的,但我想要特定的Test.Foo MethodInfo,并且应该一直保持不变,我错了吗?我的意思是,你不能做像
Test.Foo=Test.Boo
Test.Foo=()=>
…我认为每个应用程序域都是常量(可能是错误的-一些人可以确认或拒绝吗?)-但在c中,如果不使用
GetMethod
GetMethods
或表达式树,就无法获得
MethodInfo
。是的,要想做你想做的事情,简直是不可能的。这就是为什么你总是把引用方法的属性看作字符串名,而不是b/c。这很漂亮,但这就是你所能做的。这很遗憾,但我能做什么呢。谢谢你的信息!(顺便说一句,有趣的是代码使用.Net编译得很好,但Unity3D使用的是Mono。)