使用不同类型但使用通用方法调用对象中的方法

本文关键字:方法 对象 调用 同类型 | 更新日期: 2023-09-27 18:19:34

我在一个静态类中有一个方法,该方法提供了对eventHandler的引用,以便它可以跟踪其中的订阅者数量。可以有多个eventshandler,但它们都有"GetInvocationList()"方法。那么,如何对不同类型的对象调用"GetInvocationList()"方法呢。

static class EventTracker
{
    public static ArrayList arrayList1;
    static EventTracker()
    {
        arrayList1 = new ArrayList();
    }
    public static void AddRecord(String publisherName, object publisher)
    {
        arrayList.Add((publisher as publisherName).GetInvocationList().Length); //doesnot work
    }
}

这些是调用方法。

EventTracker.AddRecord("SelectionAwareEventHandler", SelectionChanged);
EventTracker.AddRecord("NumberChangedEventHandler", NumberChanged);

以下是如何定义事件处理程序

public event SelectionAwareEventHandler SelectionChanged;
public event NumberChangedEventHandler NumberChanged;

使用不同类型但使用通用方法调用对象中的方法

假设您有一个非类型化的事件处理程序引用,如

object publisher = ...;
MethodInfo getInvocationListMethod = publisher.GetType().GetMethod("GetInvocationList");
// call the method
Delegate[] invocationList = (Delegate[])getInvocationListMethod.Invoke(publisher, null);
int length = invocationList.Length;

您也可以重写AddRecord方法,使其不使用object,而是使用delegate作为publisher。此外,publisher as publisherName不会编译。如果您的object publisherEventHandler,例如delegate,则您根本不需要发布者名称,因为GetInvocationList是为所有EventHandler 定义的

public static void AddRecord(delegate publisher)
{
    arrayList.Add(publisher.GetInvocationList().Length);
}

或者如果您确信object publisher将始终是delegate ,则简单地将您的publisher转换为delegate

public static void AddRecord(object publisher)
{
    arrayList.Add((publisher as Delegate).GetInvocationList().Length);
}