C#将静态类放入字典中

时间:2017-11-14 21:02:08

标签: c# dictionary static

在我之前提出的一个问题中我不清楚所以我会试着更明确一些。

有没有办法将静态类放在字典中,以便可以调用其函数?如果这是不可能的,那么不使用您建议的实例的最佳替代方案是什么?

以下是我想要使用它的方法:

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

3 个答案:

答案 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等继承。