2009-04-14 11 views
8

Dies könnte ein bisschen ein Anti-Muster sein, aber es ist möglich, dass eine Eigenschaft in einer C# -Klasse mehrere Werte akzeptiert?Kann eine C# -Eigenschaft mehrere Werte akzeptieren?

Zum Beispiel, ich habe eine Public Int-Eigenschaft und ich möchte immer, dass es eine int zurückgibt, aber ich möchte in der Lage sein, die Eigenschaft durch Zuweisen einer Dezimalzahl, einer Ganzzahl oder eines anderen Datentyps festgelegt haben. Meine Frage ist also, ob es für Eigenschaften möglich ist, mehrere Werte zu akzeptieren.

Antwort

10

denke ich, was Sie meinen fragen ist: Wie implicit und explicit Arbeit für int und decimal Gießen?

Sie fragen nach implizitem Casting, das automatisch ein Objekt in einen anderen definierten Typ umwandelt. Sie können dies nicht für eine int und decimal tun, da sie bereits im Framework definiert sind und Sie den Umfang der decimal nicht reduzieren können, indem Sie es auf int werfen. Aber wenn Sie das als Beispiel für tatsächliche Objekte verwenden, die Sie erstellt haben, können Sie den oben genannten Link implicit verwenden, um mehr darüber zu erfahren, wie dies funktioniert und wie es implementiert wird.

Sie können jedoch immer die Konvertierungsmethode verwenden, um sie in den richtigen Typ zu konvertieren;

public int MyProperty { get; set; } 
... 
obj.MyProperty = Convert.ToInt32(32.0M); 
obj.MyProperty = Convert.ToInt32(40.222D); 
obj.MyProperty = Convert.ToInt32("42"); 
+0

Ich benutzte Ints und Dezimalzahlen mehr als ein Beispiel, aber es ist verwandt. Im Wesentlichen möchte ich nur in der Lage sein, mehrere verschiedene Typen einer einzelnen Eigenschaft zuzuweisen und der Eigenschaft zu überlassen, was zurückgegeben werden soll. Wie Sie bereits erwähnt haben, erlaubt das implizite Casting dies. – lomaxx

+0

Die einzige andere Sache, die ich hinzufügen werde, ist, dass das implizite Casting das Problem lösen wird, aber den Umfang nicht ausreichend zu begrenzen scheint. Es wird gut funktionieren für das, was ich versuche, aber ich kann potenzielle Probleme mit im (ex) plicit Casting sehen, wenn ich jemals spezifische Regeln für jeden Cast brauche. – lomaxx

+0

Mit all dem, was ich gesagt habe, denke ich immer noch, dass ich ein Anti-Muster versuche und es wahrscheinlich besser wäre, es in einer dynamischen Sprache zu tun, in der ich alles zuweisen kann, was ich will oder überlege, was ich tue um das Problem an erster Stelle zu vermeiden. – lomaxx

-1

Eigenschaften sollen aussehen wie öffentliche Felder. Erstellen Sie Setter-Methoden oder führen Sie die Umwandlung in den Zuweisungsanweisungen im Gegensatz zum Property-Setter aus.

0

Nein. Eine Eigenschaft hat einen einzelnen Wert. Sie können ihm alles zuweisen, das einer Variablen desselben Typs zugewiesen werden kann.

+0

Das ist nicht wahr, Sie können es jedem Objekt zuweisen, für das explizit ein Cast generiert werden kann. –

+0

@Nick Berardi: Das ist nicht korrekt. Sobald Sie es in einen anderen Typ umgewandelt haben, weisen Sie den anderen Typ zu! –

+0

@John: Einverstanden, weiß nicht, was Nick raucht. – Samuel

1

Es scheint, als müssten Sie den Typ zur Laufzeit ermitteln. Sie könnten die Eigenschaft ein Objekt akzeptieren lassen, den Typ bestimmen und Ihre Aktion ausführen. Sie müssten natürlich Ausnahmen für Dinge einwerfen, die Sie nicht erwarten. Wie du sagst, wahrscheinlich nicht das Beste, aber möglich. :)

2

Edit: Diese Methode kann nicht verwendet werden, da die op speziell auf Eigenschaften gebunden ist.

Ich glaube nicht, dass dies mit der Robustheit möglich ist, die Sie beschreiben. In diesem Fall wäre es wahrscheinlich besser, eine überladene Methode (Polymorphismus) zu verwenden.

Dies ist, was normalerweise als Setter (oder Mutator) bekannt ist, und Sie können die Methode überladen, um mehrere verschiedene Arten von Parametern zu akzeptieren. Jeder wird anders durchführen, wenn Sie es wünschen. Die Art, wie ich sie eingerichtet habe, ist vielleicht nicht syntaktisch korrekt, aber das ist die allgemeine Idee, die du suchst, glaube ich.

public class MyClass { 
    private Int32 mySomeValue; 
    public void setSomeValue(Double value) { this.mySomeValue = Convert.ToInt32(value); } 
    public void setSomeValue(Int32 value) { this.mySomeValue = value; } 
}