2010-06-30 5 views
5

Ich weiß, Sie können nicht statisch Mitglieder von Instanz Mitgliedern.Ein Weg, um nicht statische Informationen aus dem statischen Kontext zu bekommen

Aber läßt sagen, dass ich in einer Versammlung habe dies:

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

diese in einer anderen Baugruppe Dann:

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

Gibt es eine Möglichkeit noch eine andere Möglichkeit, bei dieser Methode in der Klasse A zu erhalten ... arbeiten einige daran?

+1

Sie benötigen eine Instanz von 'ClassA', um' GetOrders (..) 'aufzurufen, da sie nicht als' static' gekennzeichnet ist. Hast du es stattdessen "statisch" gemeint? –

+0

ClassA ist ein Singleton – PositiveGuy

+0

Ich denke, ich könnte den Singleton an die andere Versammlung möglicherweise in diese Methode in ClassB übergeben – PositiveGuy

Antwort

12

Sie sicher können Zugriff auf statische Member von Instanz Mitglieder ... aber Sie sollten verstehen, warum Sie nicht Instanz Mitglieder ohne eine Instanz zugreifen können.

Ihre Klasse sagt im Grunde, dass jede Instanz von ClassA Ihnen ermöglicht, eine Liste von Aufträgen zu erhalten, die einer bestimmten ID zugeordnet sind. Nun können verschiedene Instanzen von ClassA andere Ergebnisse liefern - zum Beispiel könnten sie sich mit verschiedenen Datenbanken verbinden. Welche Ergebnisse möchten Sie in DoSomethingElse bekommen?

Um ein einfacheres Beispiel zu geben, nehmen wir eine Person Klasse hatte, und jeder hatte einen Namen: „Was ist Person.Name

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

Macht es Sinn, zu fragen, Nein - weil Sie nicht angegeben haben, von welcher Person Sie sprechen.

Sie sollten entweder ClassA.GetOrders statisch machen - wenn es keine pro-Instanz Informationen, einschließlich virtueller Elemente beinhalten wird - oder machen ClassB Kenntnis von der Instanz von ClassA zu verwenden, wenn die Aufträge herauszufinden.

Wenn Sie uns realistischere Namen für diese Klassen wissen lassen könnten, könnten wir eine Anleitung geben, welche Lösung eher geeignet ist ... persönlich würde ich im Allgemeinen bevorzugen, wie statische Mitglieder im Allgemeinen führen zu weniger testbaren Code.

+0

Ich spreche über den Zugriff auf nicht statische Mitglieder durch statische Mitglieder ... anders herum ist das nicht möglich. – PositiveGuy

+0

@coffeeaddict: "nicht statisch" = "Instanz". Mein erster Satz ist eine Antwort auf * Ihren * ersten Satz: "Ich weiß, dass Sie nicht auf statische Mitglieder von Instanz-Mitgliedern zugreifen können und umgekehrt." Das ist einfach falsch. –

+0

Ja, ich verstehe das alles. Ich denke, ich habe mich gefragt, ob es eine Alternative gibt, um dieses Problem zu umgehen. Ich möchte ClassA nicht ändern, um statisch zu sein oder umgekehrt. Ich hätte ein großes Refactoring-Problem. – PositiveGuy

4

nicht sicher, ob ich Sie richtig verstanden habe, aber versuchen new ClassA().GetOrder(orderID);

+0

ClassA ist ein Singleton ... – PositiveGuy

1

Ich weiß, dass Sie nicht auf statische Mitglieder von Instanz-Mitgliedern zugreifen können und umgekehrt.

Eigentlich können Sie.

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

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

aber in die andere Richtung (zB von statisch) gehen Sie tatsächlich benötigen, um eine Instanz zu erstellen:

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

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

Sie können verwirrend sein static damit in verschiedenen Sprachen Bedeutung ist.In C# bedeutet dies, dass das Element nicht auf eine bestimmte Instanz der Klasse gebunden ist, können Sie in der Tat könnte das statische Element aus den obigen Beispielen wie folgt aufrufen:

MyClass.Foo(); 
0

Wenn Sie den Zugriff auf die Instanz Singleton benötigen und Sie Haben Sie keinen statischen Singleton Accessor (wie .Instance oder .GetInstance()), dann können Sie die Instanz in ClassB vor dem Aufruf der Methode in irgendeiner Weise injizieren (dieses Beispiel verwendet ein statisches öffentliches Feld, aber Sie wollen etwas sicherer in der Praxis) :

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 
    } 
} 

Alternativ können Sie die ClassA-Instanz direkt in DoSomethingElse übergeben. Da ClassB von ClassA abhängt, könnte es sinnvoller sein, dass ClassB auch ein Singleton-ähnlicher Dienst ist, mit dem Sie die Instanz von ClassA über den Konstruktor (möglicherweise automatisch mit einem IoC-Framework) injizieren können.

Verwandte Themen