反射属性方法

本文关键字:方法 属性 反射 | 更新日期: 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(在没有目标对象的情况下可以调用),要么您也需要以某种方式获得匹配的对象。