2017-03-22 1 views
0

Ich versuche einen Weg zu finden, um ein Schalter-ähnliches Verhalten während der Instantiierung eines Objekts mit unterschiedlichen Eigenschaften zu erreichen.Instantiate-Eigenschaft basierend auf ID ohne Duplizierungscode

Mein Objekt sieht wie folgt aus

class FooProperty 
{ 
    Nullable<int> IntergerValue {get; set;} 
    Nullable<bool> BoolValue {get; set;} 
    Nullable<float> FloatValue {get; set;} 
    string StringValue {get; set;} 
} 

Ich brauche Instanzen meiner Klasse instanziiert basiert auf einem interger, die den Typ der Eigenschaft abbildet - die instantiate Funktion, die ich wie folgt aussieht bin der Gestaltung:

public void Instantiate(int mappingKey, object value) 
{ 
    //Instantiate either interger, bool, float or string based on mappingKey 
} 

Der entscheidende Punkt hier ist, dass ich NICHT einen Schalter Fall wie diesem

machen wollen 0

Aufgrund umfangreicher Code-Duplizierung. Ich denke, dass es einen klügeren Weg geben muss, um zu entscheiden, welche Eigenschaft die Objekt-Instanziierung jedes Mal ohne Duplizierung instanziiert.

Antwort

3

Dieser Entwurf scheint gebrochen. Wenn die Eigenschaften innerhalb FooProperty (übrigens ein schrecklicher Name für eine Klasse) nur abhängig von einem Schalter eine FooProperty für eine Zeichenfolge mit nichts gemeinsam mit einer für Typ int machen, sollten sie nicht durch eine gemeinsame Klasse wiedergegeben werden. Wenn Sie eine Klasse verwenden, sollten alle Mitglieder innerhalb dieser Klasse in einem gewissen Sinne zusammengehören, was in Ihrem Programm nicht der Fall ist.

Sie können jedoch Generika für das verwenden:

class FooProperty<T> 
{ 
    T Value { get; set; } 
} 

So erstellen Instanzen nennen dies:

var foo = new FooProperty<string>(); 
foo.Value = "Hell World"; 

Jetzt kannst du nicht einen int-Wert FooProperty.Value als Es ist vom Typ zuordnen Zeichenfolge.

Sie können auch eine Fabrik-Methode erstellen, die Instanzen von FooProperty erstellt:

static FooProperty<T> Instantiate<T>(T value) 
{ 
    return new FooProperty<T> { Value = value }; 
} 

, die Sie leicht wie folgt aufrufen können:

var newInstance = Instantiate("Hello World") 

für einen String oder

var newInstance = Instantiate(3); 

für eine int-Eigenschaft.

Verwandte Themen