2016-08-07 25 views
0

auf eine andere Eigenschaft zuweisen Wenn ichRufen Sie einen Verweis auf eine Eigenschaft in C# und das

public class ClassA 
{ 
    public static IEnumerable<string> WhateverA { get; set; } 
} 

und auch

public class ClassB 
{ 
    public static IEnumerable<string> WhateverB { get; set; } 
} 

Ist haben es möglich, einen Verweis auf ClassA.WhateverA und weisen es ClassB.WhateverB zu erhalten so dass, wenn WhateverA später einen Wert zugewiesen wird, WhateverB wird folglich die gleiche zugewiesen?

Wenn ich war auf der Suche das gleiche mit Methoden zu tun, dann ich WhateverB als Action erklären könnte und dann WhateverA als Delegierter zuweisen, so dass ihm eine Art ‚Pass-Through‘ Fähigkeit zu geben. Ist es möglich, das Gleiche mit einer Eigenschaft zu tun, so dass WhataverB immer den Wert WhateverA anzeigt?

+0

Hat ClassB eine Referenz zu ClassA? – brent

+0

Nein, beide kennen sich nicht, also wird die Zuweisung über Reflection an einem "neutralen Ort" erfolgen. – awj

Antwort

1

Wenn Sie einen Verweis auf ClassA in ClassB haben, können Sie die ClassA-Eigenschaft einfach umbrechen.

public class ClassB 
{ 
    static ClassA a; 

    public static IEnumerable<string> WhateverB 
    { 
     get { return a.WhateverA; } 
     set { a.WhateverA = value; } 
    } 
} 

Wenn nicht, können Sie Aktion <> und Func <> verwenden Delegierten passieren um den Getter und Setter - ähnlich dem, was Sie sagten, Sie mit Methoden getan haben. Sie müssen nur die Setter und Getter als separate Methoden behandeln (darunter sind sie).

Um dies zu tun mit einem Setter: öffentliche Klasse ClassB { statische Aktion> aSetter; statische Funktion> aGetter;

public static IEnumerable<string> WhateverB 
    { 
     get 
     { 
      if (aGetter != null) 
      { 
       return aGetter(); 
      } 
     } 
     set 
     { 
      if (aSetter != null) 
      { 
       aSetter(value); 
      } 
     } 
    } 
} 
+0

Also würde ich im Wesentlichen den Getter von 'ClassB' auf den Getter von' ClassA' richten, und ebenso für die Setter? – awj

+0

Kannst du vielleicht ein Beispiel dafür geben, wie man den Setter einer Eigenschaft setzt? Ich kann leicht 'ClassA''s Setter erhalten, aber ich kann nicht herausfinden, wie man das als' ClassB's Setter benutzt. – awj

+0

Ich habe ein Beispiel hinzugefügt – brent

0

Sie könnten pub/sub-System von MVVMLight (oder ähnlichem) angeboten verwenden Mitteilungen zwischen den Klassen zu senden und empfangen und direkte Abhängigkeiten zwischen ClassA und ClassB entkoppeln.

Überlegen Sie, Ihre Klassen so zu ändern.

public class ClassA 
{ 
    private static IEnumerable<string> _whateverA; 

    public static IEnumerable<string> WhateverA 
    { 
     get { return _whateverA; } 
     set 
     { 
      _whateverA = value; 
      // property changed, send message 
      Messenger.Default.Send(new MyMessage(value)); 
     } 
    } 
} 

public class ClassB 
{ 
    public ClassB() 
    { 
     // receive message 
     Messenger.Default.Register<MyMessage>(this, message => 
     { 
      WhateverB = message.Value; 
      Console.WriteLine(string.Join(" ", WhateverB)); 
     }); 
    } 

    public static IEnumerable<string> WhateverB { get; set; } 
} 

Nun, wenn ClassA Eigenschaft ändert, wird es ClassB mitteilen es Eigenschaftswert entsprechend zu ändern. Wenn die Instanz nicht existiert, wird der Code auch zur Laufzeit nicht abstürzen.

Oberhalb MyMessage ist eine einfache Klasse, um die Weitergabe von Daten zu erleichtern. Sie entscheiden, wie diese Klasse aussehen soll (halten Sie alle ClassA-Instanzen?).

public class MyMessage : MessageBase 
{ 
    public MyMessage(IEnumerable<string> value) 
    { 
     Value = value; 
    } 

    public IEnumerable<string> Value { get; private set; } 
} 

Nun, wenn Sie ein super schönes Programm haben

public class Program 
{ 
    static void Main() 
    { 
     var b = new ClassB(); 

     ClassA.WhateverA = new List<string> { "this", "is", "whatever" }; 
     Console.ReadLine(); 
    } 
} 

Es wird auf Konsole spucken

example


Sie werden installieren müssen MVVMLight Bibliotheken über NuGet, um loszulegen.

PM> Install-Paket MvvmLightLibs -Version 5.2.0