2016-05-04 7 views
0

Ich komme heute mit einer seltsamen Frage. Gibt es einen Weg, wo ich eine nicht statische Klasse wie statische verwenden kann?Zugriff auf eine Eigenschaft einer nicht-statischen Klasse an jedem Ort

D.h.: Wir haben die folgenden Klassen:

public class Parameters 
{ 
    public String LoadType { get; set; } 
    public Parameters (String inLoadType) 
    { 
      LoadType = inLoadType; 
    } 
} 

public class MainClass 
{ 
    public Parameters Parameters { get; set; } 

    public MainClass(String inLoadType) 
    { 
     Parameters = new Parameters(inLoadType); 
    } 
} 

Jetzt instantiieren wir Mainclass, dann irgendwo in einem anderen Ort, der nicht der Mainclass ich auf die LoadType zugreifen möchten ist.

Es sollte threadSafe sein, auch die Operation dauert ziemlich lange, das ist der Grund, warum ich einfach nicht einfach eine Sperre verwenden und statisch machen kann.

Die Klasse, auf die ich auf diese Variable zugreifen möchte, ist statisch, ich dachte in einer Problemumgehung mit einem statischen Ereignis in der Klasse Parameters, und wer das Ereignis aufruft, würde den Wert der instanziierten Klasse oder etwas ähnliches erhalten. Irgendwelche anderen Ideen darüber abgesehen davon, als Parameter an die statische Methode zu übergeben, was ich brauche?

Klingt wie dumme Frage, aber ich will nur wissen, ob es möglich ist oder nicht.

+4

Sie einen Singleton benötigen. – dotctor

+0

Ja Singleton-Klasse wird hier funktionieren –

+0

Singleton wäre statisch, wenn ich außerhalb der MainClass zugreifen möchte, dann wäre es nicht threadsicher. Liege ich falsch? – Nekeniehl

Antwort

1

Stellen Sie sich vor, dass Sie zweiParameters Instanzen

Parameters one = new Parameters("One"); 
    Parameters two = new Parameters("Two"); 

und dann rufen Sie haben:

String result = SomeWeirdBlackMagicCallOfLoadType(); 

Was ist das erwartete Ergebnis? "One" oder "Two"? Um dieses Problem zu lösen, können Sie Parameters in Singletone drehen (eine Instanz beschränkt) und somit wird der Anruf

String result = Parameters.Instance.LoadType; 

sein, aber ich schlage vor, die Behandlung von static als static, wenn Daten hängen nicht von Instanz. Im Fall von langen Operationen, Thread-Sicherheit können Sie Lazy<String> verwenden, die speziell dafür ausgelegt ist:

public class Parameters { 
    private static Lazy<String> s_LoadType = new Lazy<string>(() => { 
     .... 
     return "bla-bla-bla"; 
    }); 

    public static String LoadType { 
     get { 
     return s_LoadType.Value; 
     } 
    } 
    ... 
    }