反射属性方法
本文关键字:方法 属性 反射 | 更新日期: 2023-09-27 17:58:40
我有一个asbtract类,我有从中分离出来的类
[PluginEventAttribute(PluginEvent.Load)]
public void OnLoad()
{
Log("Test Plugin loaded!");
}
我希望我的代码检查是否有一个使用该属性的方法,如果是,请使用自定义参数调用它。如何在C#winforms中做到这一点?
您只需要枚举实例方法,并调用具有上述属性的方法。下面是一个工作示例(我希望我能正确理解你的意图):
using System;
using System.Reflection;
class Program
{
class MyAttr : Attribute { }
abstract class Base { };
class Derived : Base
{
[MyAttr]
public void foo() { Console.WriteLine("foo"); }
public void bar() { Console.WriteLine("bar"); }
}
static void Main()
{
Base someInstance = new Derived();
foreach (var m in someInstance.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance))
{
if (m.GetCustomAttribute(typeof(MyAttr)) != null)
{
m.Invoke(someInstance, null); // prints "foo"
}
}
Console.ReadLine();
}
}
您可以将对Invoke
的调用中的null
参数更改为要传递给函数的参数数组。该数组的内容必须与函数签名匹配。
这与WinForms无关。这一切都与CLR运行时及其类型系统有关。
我不知道你怎么能"就这么做"。
只有当您有一个描述方法(methodinfo.GetCustomAttributes()
)的MethodInfo
对象时,才能检查方法M是否具有属性a
可以通过多种方式获取MethodInfo
,但最简单、最明显的是获取Type
对象并询问其方法(type.GetMethod()/type.GetMethods()
)。
您也可以通过多种方式获得Type
对象。如果手头有任何对象,则可以调用其GetType()
方法。或者,您可以向Assembly
对象(描述DLL或EXE)询问其定义的类型。(..)
所以,如果你有一个foo
对象,已经有人创建了:
call foo.GetType()
loop over type.GetMethods()
call method.GetCustomAttributes(typeof(YourAttribute))
check if it was found
现在,如果您注意到它已被找到,那么您将最终得到一个MethodInfo,它与具有该属性的方法相匹配。剩下的就是用methodinfo.Invoke
调用该方法,并将参数和传递给foo对象。
如果您没有想要扫描方法的foo
对象,情况就会变得棘手。您必须获取整个程序集,扫描所有类型,扫描它们的所有方法。您最终再次获得匹配的MethodInfo。但是您没有任何对象可以调用所找到的方法。要么该方法需要是static
(在没有目标对象的情况下可以调用),要么您也需要以某种方式获得匹配的对象。