如何在 C# 中访问通用静态 class 的所有特定版本?

How to access all specific versions of a generic static class in C#?

假设我有以下静态 class:

public static class Foo<T>
{
    private static T Baz;

    /* other members */

    public static void Bar()
    {
        //do something with Baz
    }
}

是否有一种内置方法可以在不知道所使用的类型参数的情况下为泛型 class 的所有特定版本调用 Bar()?也就是说,如果Foo<T>的消费者已经使用了Foo<Larry>Foo<Curly>Foo<Moe>,我如何调用所有的Foo<Larry>.Bar()Foo<Curly>.Bar() 等方法在不显式指定泛型类型的情况下自动执行?

那是不可能的。使用 Foo<T> 的静态构造函数来维护 Baz 值的全局列表。该全局列表必须植根于 Foo<T>.

之外的静态变量

T 的可能性是无限的。无法知道什么可能用于 T。您可以使用静态构造函数跟踪已用于 T 的类型并对所有这些类型执行操作。

我在这里创建了一个 class,其中包含一个包含动作列表的静态变量。 Action 匹配 void Bar() 的签名,因此要调用不同的签名,请使用不同的类型,即 Action<string> 调用 void Bar(string x)Func<int,string> 调用 string Bar(int val).

public static class FooTracker
{
    public static List<Action> AllBars = new List<Action>();
    public static void CallAllBars()
    {
        AllBars.ForEach(v => v());
    }
}

public static class Foo<T>
{
    static Foo()
    {
        FooTracker.AllBars.Add(() => Bar());
    }

    public static void InitFoo() 
    { 
        // do nothing other than cause static constructor to run
    }


    private static T Baz;

    /* other members */

    public static void Bar()
    {
        //do something with Baz
        Debug.Print(typeof(T).Name);
    }
}

如果您使用下面的代码来调用它,您会发现 Foo<Curly>.Bar() 没有被调用,因为静态构造函数在 CallAllBars() 调用之后才被 运行 调用。

Foo<Larry>.InitFoo();
Foo<Moe>.InitFoo();

FooTracker.CallAllBars();

Foo<Curly>.InitFoo();