Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将静态类放入字典中_C#_Dictionary_Static - Fatal编程技术网

C#将静态类放入字典中

C#将静态类放入字典中,c#,dictionary,static,C#,Dictionary,Static,我在前面提出的一个问题中不清楚,所以我会尽量说得更清楚 有没有一种方法可以将静态类放入字典中,以便调用它的函数?如果这是不可能的,那么不使用您可以建议的实例的最佳替代方案是什么 以下是我想如何使用它: static class MyStatic : IInterface { static void Do(){} } static class MyStatic2 : IInterface { static void Do(){} } class StaticMap {

我在前面提出的一个问题中不清楚,所以我会尽量说得更清楚

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

以下是我想如何使用它:

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();
    }
}
static类MyStatic:IInterface
{
静态void Do(){}
}
静态类MyStatic2:i接口
{
静态void Do(){}
}
类静态映射
{
静态字典=新字典
{
{Type.1,MyStatic}
{Type.2,MyStatic2}
};
}
//客户端代码
类ClientCode
{
void Start()
{
StaticMap.dictionary[Type.1].Do();
}
}

创建一个单例实例,而不是将整个类作为静态类

public class Foo
{
   public static Foo _Foo;
   public Foo()
   {
      _Foo = this;
   }
}

然后您可以将其添加到列表中,也可以从接口等继承。

创建一个单例实例,而不是将整个类作为静态类

public class Foo
{
   public static Foo _Foo;
   public Foo()
   {
      _Foo = this;
   }
}

然后您可以将其添加到列表中,也可以从接口继承,等等。

不能直接这样做有一些基本原因:

void Start()
{
    StaticMap.dictionary[Type.1]();
}
  • 静态方法调用在编译时绑定
  • 静态调用不是继承的-它们绑定到定义它们的类
  • 静态方法之间没有隐式的基类型(因此也没有多态性),即使名称、输入和输出都是相同的
由于您的签名对于每个静态方法都是相同的,因此您可以在字典中存储
操作

static Dictionary<Type,Action> dictionary = new Dictionary<Type,Action>
{
    {Type.1, MyStatic.Do}
    {Type.2, MyStatic2.Do}
};

它有点重复,因为您还必须在字典中指定方法名称,但它是类型安全的。

不能直接这样做有一些基本原因:

void Start()
{
    StaticMap.dictionary[Type.1]();
}
  • 静态方法调用在编译时绑定
  • 静态调用不是继承的-它们绑定到定义它们的类
  • 静态方法之间没有隐式的基类型(因此也没有多态性),即使名称、输入和输出都是相同的
由于您的签名对于每个静态方法都是相同的,因此您可以在字典中存储
操作

static Dictionary<Type,Action> dictionary = new Dictionary<Type,Action>
{
    {Type.1, MyStatic.Do}
    {Type.2, MyStatic2.Do}
};

它有点重复,因为您还必须在字典中指定方法名称,但它是类型安全的。

一个关键问题是您是想对每个类型调用一个方法,还是需要调用属于每个类型的多个方法

如果这只是一个单一的方法,那么D斯坦利建议的就是答案。如果您存储了大量的
操作
s,每一个都代表一个在不同的静态类上具有相同签名的方法,那么您就完成了您所说的

然而,这提出了一个问题——为什么每个方法都必须属于一个单独的静态类?如果某些或所有方法属于同一类,这种方法也同样有效

如果需要从每个类中调用多个方法,则
操作将不再起作用。您必须存储
操作的集合,这a)意味着类实例,b)比仅仅使用接口和类实例复杂得多

管理实例的一种方法是使用依赖项注入容器为您创建类实例。使用这种方法,您可以创建非静态类,而不必经历显式地将它们设置为单例的麻烦。但是您可以告诉容器只生成其中一个并重用它。例如,使用Castle Windsor:

container.Register(Component.For<ISomeInterface,SomeClass>));
container.Register(Component.For));
现在,每次要求容器提供
ISomeInterface
的实例时,它都会提供相同的
SomeClass
实例


因为您要查找的依赖项因类型而异(
Dictionary
),所以听起来您要查找的可能与泛型相关。但是,有必要从较小的问题中退一步,对你试图完成的事情有一个稍微大一点的了解

一个关键问题是,您是想对每种类型调用一个方法,还是需要调用属于每种类型的多个方法

如果这只是一个单一的方法,那么D斯坦利建议的就是答案。如果您存储了大量的
操作
s,每一个都代表一个在不同的静态类上具有相同签名的方法,那么您就完成了您所说的

然而,这提出了一个问题——为什么每个方法都必须属于一个单独的静态类?如果某些或所有方法属于同一类,这种方法也同样有效

如果需要从每个类中调用多个方法,则
操作将不再起作用。您必须存储
操作的集合,这a)意味着类实例,b)比仅仅使用接口和类实例复杂得多

管理实例的一种方法是使用依赖项注入容器为您创建类实例。使用这种方法,您可以创建非静态类,而不必经历显式地将它们设置为单例的麻烦。但是您可以告诉容器只生成其中一个并重用它。例如,使用Castle Windsor:

container.Register(Component.For<ISomeInterface,SomeClass>));
container.Register(Component.For));
现在,每次要求容器提供
ISomeInterface
的实例时,它都会提供相同的
SomeClass
实例


因为您要查找的依赖项因类型而异(
Dictionary
),所以听起来您要查找的可能与泛型相关。但是,有必要从较小的问题中退一步,对你试图完成的事情有一个稍微大一点的了解

听起来你不应该使用静态类。这就是实例的用途。”在前面的问题中