从静态上下文获取非静态信息的方法

时间:2010-06-30 19:24:43

标签: c#

我知道你不能从实例成员那里获得静态成员。

但是让我说我​​有一个集会:

public class ClassA
{
    public List<order> GetOrders(int orderID)
    {
        ...
    }
}

然后在另一个集会中:

public static ClassB
{
    private static void DoSomethingElse(int orderID)
    {
        List<order> orderList = ClassA.GetOrders(orderID);
        ...rest of code
    }
}

有没有办法在A类中以某种其他方式获得该方法...有些人可以解决这个问题吗?

4 个答案:

答案 0 :(得分:15)

您当然可以从实例成员访问静态成员...但您应该了解为什么您无法在没有实例的情况下访问实例成员。

您的班级基本上说ClassA的每个实例都允许您获取与特定ID相关联的订单列表。现在,ClassA的不同实例可能会产生不同的结果 - 例如,它们可能连接到不同的数据库。您希望获得哪些结果DoSomethingElse

举一个更简单的例子,假设我们有一个Person类,每个人都有一个名字:

public class Person
{
    public string Name { get; set; }
}

问“什么是Person.Name?”是否有意义?不 - 因为你没有说明你在说什么人。

您应该ClassA.GetOrders静态 - 如果它不涉及任何每个实例的信息,包括虚拟成员 - 或让ClassB知道ClassA要使用的实例找出订单。

如果你能让我们知道这些课程的更实际的名称,我们可以提供更合适的解决方案的指导...我个人通常赞成后一种方法,如静态成员通常会导致代码可测试性降低。

答案 1 :(得分:4)

不确定我是否正确,但请尝试new ClassA().GetOrder(orderID);

答案 2 :(得分:2)

  

我知道您无法从实例成员访问静态成员,反之亦然。

其实你可以。

public class MyClass
{
   public static void Foo()
   {
       Console.Write("Foo");
   }

   public void Bar()
   {
       Foo(); // Perfectly valid call
   }
}

但是从另一个方面来说(实例来自静态)你需要实际创建一个实例:

public class MyClass
{
   public static void Foo()
   {
       MyClass c = new MyClass();
       c.Bar();
   }

   public void Bar()
   {
       Console.Write("Foo");
   }
}

您可能会将static不同语言中的含义混淆。在C#中,这意味着该成员未绑定到该类的任何特定实例,您实际上可以从上面的示例中调用静态成员,如下所示:

MyClass.Foo();

答案 3 :(得分:0)

如果您需要访问Singleton实例并且没有静态单例访问器(例如.Instance.GetInstance()),那么您可以在调用之前通过某种方式将实例注入ClassB该方法(此示例使用公共静态字段,但您在实践中需要更安全的东西):

public static class ClassB
{
    //The single instance has to be injected before DoSomethingElse can be used
    public static ClassA ClassA;

    private static void DoSomethingElse(int orderID)
    {
        List<Order> orderList = ClassA.GetOrders(orderID);
        //...rest of code
    }
}   

或者,您可以将ClassA实例直接传递给DoSomethingElse。由于ClassB依赖于ClassA,因此ClassB成为单例式服务可能更有意义,它允许您通过构造函数注入ClassA的实例(可能会自动使用某些IoC框架)。