Frage

Gibt es eine Möglichkeit, das dahinter liegendes Feld für eine Eigenschaft zuzugreifen, um die Validierung zu tun, ändern usw. zu verfolgen.?

Ist so etwas wie die folgende möglich? Wenn nicht, ist es Pläne, es zu haben, in .NET 4 / C # 4?

public string Name
{
    get;
    set
    {
        if (value != <Keyword>)
        {
            RaiseEvent();
        }
        <Keyword> = value;
    }
}

Das Hauptproblem ist, dass ich Auto Eigenschaften mit Hilfe nicht für die gleiche Flexibilität bei der Validierung erlaubt etc., das eine Eigenschaft mit einem expliziten dahinter liegenden Feld des Fall ist. Allerdings eine explizite Unterstützung Feld den Nachteil, in einigen Situationen zu erlauben, die Klasse hat es enthalten ist, in dem dahinter liegenden Feld zuzugreifen, wenn es die Validierung sollte den Zugriff und die Wiederverwendung, ändern usw. der Immobilie Tracking wie jede andere Klasse, die zugreifen kann Eigentum von außen.

In dem obigen Beispiel Zugriff auf das dahinter liegendes Feld zu Eigentum Umgehung der Immobilie Validierung und verhindert so scoped würde, ändern usw. zu verfolgen.

Edit: ich habe mich verändert auf . Ich würde ein neues Schlüsselwort ähnlich dem Wert vorzuschlagen. wäre schön tun, obwohl ich sicher bin, es in einer Menge von vorhandenen Code verwendet werden wird.

War es hilfreich?

Lösung

Ihre Kommentare in Mehrdad Antwort gelesen, ich glaube, ich verstehe Ihr Problem ein bisschen besser.

Es scheint, dass Sie über die Fähigkeit des Entwicklers betroffen sind in der Klasse privat Zustand zugreifen sie zu schreiben sind, Ihre Validierungslogik unter Umgehung usw. Dies legt nahe, dass der Staat nicht in der Klasse enthalten sein.

Ich würde vorschlagen, die folgende Strategie. Schreiben Sie eine generische Klasse, die eine ValidatedValue darstellt. Diese Klasse enthält nur den Wert Träger und erlaubt nur den Zugriff / Mutation über Get- und Set-Methoden. Ein Delegierter an der ValidatedValue geleitet, um die Validierungslogik darzustellen:

public class ValidatedValue< T >
{
    private T m_val;
    public ValidationFn m_validationFn;

    public delegate bool ValidationFn( T fn );

    public ValidatedValue( ValidationFn validationFn )
    {
        m_validationFn = validationFn;
    }

    public T get()
    {
        return m_val;
    }

    public void set(T v)
    {
        if (m_validationFn(v))
        {
            m_val = v;
        }
    }
}

Sie könnten sich natürlich mehr Teilnehmer hinzufügen, wie erforderlich (zB zu Pre / Post-Änderungsbenachrichtigung unterstützen).

Ihre Klasse würde nun die ValidatedValue anstelle eines Sicherungsspeicher für Ihre Immobilie nutzen.

Das folgende Beispiel zeigt eine Klasse, MyClass, mit einer ganzen Zahl, die weniger als 100. Hinweis zu sein validiert ist, dass die Logik eine Ausnahme in MyClass ist zu werfen, nicht die ValidatedValue. Auf diese Weise können Sie komplexe Validierungsregeln tun, die in MyClass enthaltenen anderen Zustand abhängen. Lambda-Notation verwendet wurde, die Validierung Delegierten zu konstruieren -. Sie auf eine Elementfunktion stattdessen gebunden haben könnte

public partial class MyClass
{
    private ValidatedValue<int> m_foo;

    public MyClass()
    {
        m_foo = new ValidatedValue<int>(
            v => 
            {
                if (v >= 100) RaiseError();
                return true;
            }
        );
    }

    private void RaiseError()
    {
        // Put your logic here....
        throw new NotImplementedException();
    }

    public int Foo
    {
        get { return m_foo.get(); }
        set { m_foo.set(value); }
    }
}

Ich hoffe, das hilft - etwas abseits der ursprünglichen Thema, aber ich denke, es ist mehr inline mit Ihrem tatsächlichen Anliegen ist. Was wir haben, ist die Validierungslogik genommen getan von der Unterkunft entfernt und legt sie auf den Daten, die genau dort, wo man es wollte.

Andere Tipps

Nein, es ist nicht. Wenn Sie das dahinter liegende Feld zugreifen möchten, dann keine automatische Eigenschaften verwenden und Ihre eigene Rolle.

Ich bin damit einverstanden, dass es groß sein würde, ein Feld zu haben, die nur über das Eigentum und nicht vom Rest der Klasse war. Ich würde das die ganze Zeit.

Wie die MSDN heißt es:

  

"In C 3.0 # und später automatisch implementierte   Eigenschaften machen Immobilien-Erklärung   prägnanter, wenn keine zusätzliche Logik   ist in den Eigenschaftenaccessoren erforderlich.   Sie ermöglichen auch Client-Code zu erstellen   Objekte Wenn Sie eine Eigenschaft deklarieren   im folgenden Beispiel gezeigt, die   Compiler erstellt eine private, anonym   Trägerfeld kann nur zugegriffen werden,   durch das get Eigentum und Set   Accessoren. "

Da Sie in Sie Accessoren zusätzliche Logik haben, die Verwendung von automatisch implementierte Eigenschaften ist in Ihrem Szenario nicht angemessen.

Während das dahinter liegende Feld vorhanden ist, wird es einen verstümmelten Namen gegeben, Sie zu stoppen leicht Referenzierung - die Idee ist, dass Sie Referenz nie das Feld direkt . Für Interessen willen, können Sie Reflector Ihren Code zu zerlegen und die Feldnamen zu entdecken, aber ich würde Sie empfehlen, das Feld nicht direkt verwenden, da dieser Name in der Tat flüchtig sein kann, so dass Ihr Code jederzeit brechen könnte.

Nein, aber Sie können in einer Unterklasse:

public class Base
{
    public string Name
    {
        get;
        virtual set;
    }
}

public class Subclass : Base
{
    // FIXME Unsure as to the exact syntax.
    public string Name
    {
        override set
        {
            if (value != base.Name)
            {
                RaiseEvent();
            }

            base.Name = value;
        }
    }
}

Wenn Sie Gonna tut so, warum Sie die automatischen Eigenschaften verwenden?

Eine einfache Eigenschaft hat in 1.0 es zurück getan. Ich glaube nicht, macht es Sinn, für jeden speziellen Fall der Komplexität der Sprache hinzuzufügen. Sie müssen entweder die Eigenschaft Ebene speichern tun / abrufen Modell oder brauchen mehr als das. Im letzteren Fall ist eine normale Eigenschaft tun wird.

Sie können dies nicht tun, ich habe Angst. Das ist einer der Gründe, begann ich MoXAML Power Toys schreiben, die Fähigkeit zur Verfügung zu stellen konvertieren automatische Eigenschaften in Eigenschaften benachrichtigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top