我知道你不能从实例成员那里获得静态成员。
但是让我说我有一个集会:
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类中以某种其他方式获得该方法...有些人可以解决这个问题吗?
答案 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框架)。