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

时间:2015-05-10 20:41:10

标签: c# generics static-methods static-classes

我们说我有以下静态类:

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

    /* other members */

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

是否有内置方法为通用类的所有特定版本调用Bar()而不知道所使用的类型参数?也就是说,如果Foo<T>的消费者将其用作Foo<Larry>Foo<Curly>Foo<Moe>,我该如何调用所有Foo<Larry>.Bar(),{{1}等等方法自动而不明确指定泛型类型?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

这里我创建了一个带有静态变量的类,其中包含一系列Actions。 Actionvoid Bar()的签名相匹配,因此要调用其他签名,请使用其他类型,即Action<string>来调用void Bar(string x)Func<int,string>来调用{{1} }}

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()