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。)