C# 反射属性法

C# 反射属性法,c#,C#,我有一个asbtract类,我有一些与之不同的类。我有一个名为PluginEventAttribute的属性,它的工作原理如下: [PluginEventAttribute(PluginEvent.Load)] public void OnLoad() { Log("Test Plugin loaded!"); } 我希望我的代码检查是否有使用该属性的方法,如果有,用自定义参数调用它。在C#winforms中如何实现这一点?您只需枚举实例方法,并调用具有上述属性的方法。下面是一个工作示

我有一个asbtract类,我有一些与之不同的类。我有一个名为PluginEventAttribute的属性,它的工作原理如下:

[PluginEventAttribute(PluginEvent.Load)]
public void OnLoad()
{
    Log("Test Plugin loaded!");
}

我希望我的代码检查是否有使用该属性的方法,如果有,用自定义参数调用它。在C#winforms中如何实现这一点?

您只需枚举实例方法,并调用具有上述属性的方法。下面是一个工作示例(我希望我正确理解了您的意图):


您可以将调用
Invoke
中的
null
参数更改为希望传递给函数的参数数组。该数组的内容必须与函数签名匹配。

这与WinForms无关。这都是关于CLR运行时及其类型系统的

我不知道你怎么能“就这么做”

只有当有描述方法的
MethodInfo
对象(
MethodInfo.GetCustomAttributes()
)时,才能检查方法M是否有属性a

可以通过多种方式获取
MethodInfo
s,但最简单、最明显的方法是获取
Type
对象并询问其方法(
Type.GetMethod()/Type.GetMethods()

您也可以通过多种方式获得
类型
对象。如果手头有任何对象,则可以调用其
GetType()
方法。或者,您可以询问
程序集
对象(描述DLL或EXE)其定义的类型。(……)

因此,如果您有一个已经有人创建的
foo
对象:

call foo.GetType()
loop over type.GetMethods()
    call method.GetCustomAttributes(typeof(YourAttribute))
    check if it was found
现在,如果您注意到它已被找到,那么您将得到一个MethodInfo,该MethodInfo与具有该属性的方法相匹配。剩下的就是用
methodinfo.Invoke
调用该方法,并将参数和foo对象传递给它


如果您没有要扫描方法的
foo
对象,情况就会变得棘手。你必须得到整个程序集,扫描所有类型,扫描它们的所有方法。您将再次获得匹配的MethodInfo。但是您没有任何对象可以调用找到的方法。要么该方法需要是静态的,要么您也需要以某种方式获得匹配的对象。

并且该属性仅限于派生类?此外,此方法不是静态的-您必须首先掌握具有此方法的实例。@OndrejSvejdar我正在创建派生类的实例,所以这很好。不,该属性不限于派生类。这是公开的。
call foo.GetType()
loop over type.GetMethods()
    call method.GetCustomAttributes(typeof(YourAttribute))
    check if it was found