在我之前提出的一个问题中我不清楚所以我会试着更明确一些。
有没有办法将静态类放在字典中,以便可以调用其函数?如果这是不可能的,那么不使用您建议的实例的最佳替代方案是什么?
以下是我想要使用它的方法:
static class MyStatic : IInterface
{
static void Do(){}
}
static class MyStatic2 : IInterface
{
static void Do(){}
}
class StaticMap
{
static Dictionary<Type,IInterface.class> dictionary = new Dictionary<Type,IInterface.class>
{
{Type.1, MyStatic}
{Type.2, MyStatic2}
};
}
// Client Code
class ClientCode
{
void Start()
{
StaticMap.dictionary[Type.1].Do();
}
}
答案 0 :(得分:5)
有一些基本原因可以解释为什么你不能直接这样做:
由于您的签名对于每个静态方法都是相同的,因此您可以在字典中存储Action
:
static Dictionary<Type,Action> dictionary = new Dictionary<Type,Action>
{
{Type.1, MyStatic.Do}
{Type.2, MyStatic2.Do}
};
然后你可以直接拨打Action
:
void Start()
{
StaticMap.dictionary[Type.1]();
}
它具有轻微的重复性,因为您还必须在字典中指定方法名称,但它的类型是安全的。
答案 1 :(得分:2)
一个关键问题是,您是要在每种类型上调用单个方法,还是需要调用属于每种类型的多个方法。
如果它只是一种方法,那么D Stanley建议的是答案。如果您存储了多个Action
,每个{1}代表一个在不同静态类上具有相同签名的方法,那么您就可以完成您所说的内容。
然而,这提出了一个问题 - 为什么每个方法必须属于一个单独的静态类的约束?如果某些或所有方法属于同一类,这种方法也可以正常工作。
如果您需要从每个班级调用多个方法,则Action
不再有效。您必须存储Action
的集合,其中a)表示类实例,b)比使用接口和类实例复杂得多。
管理实例的一种方法是使用依赖注入容器为您创建类实例。使用这种方法,您可以创建非静态类,而无需经历明确使它们成为单例的麻烦。但是你可以告诉容器只生成其中一个并重新使用它。例如,使用Castle Windsor:
container.Register(Component.For<ISomeInterface,SomeClass>));
现在每次要求容器提供ISomeInterface
的实例时,它始终会提供SomeClass
的相同实例。
因为您要查找的依赖项因类型(Dictionary<Type, Something>
)而异,所以您所寻找的内容可能与泛型相关。但是,有必要从较小的问题中退后一步,并了解你想要完成的事情的稍微大一点。
答案 2 :(得分:0)
不要将整个类视为静态,而是创建一个Singleton实例。
public class Foo
{
public static Foo _Foo;
public Foo()
{
_Foo = this;
}
}
然后你可以将它添加到你的列表中,也可以从Interfaces等继承。