我们说我有以下静态类:
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}等等方法自动而不明确指定泛型类型?
答案 0 :(得分:1)
这是不可能的。使用Foo<T>
的静态构造函数来维护Baz
值的全局列表。该全局列表必须植根于Foo<T>
之外的静态变量。
答案 1 :(得分:0)
T的可能性是无限的。无法知道可能用于T的内容。您可以使用静态构造函数跟踪已经用于T的类型并对所有这些类型执行操作。
这里我创建了一个带有静态变量的类,其中包含一系列Actions。 Action
与void 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()