Best Practices über das Erstellen eines generischen Objektwörterbuchs in C#? Ist das schlecht?

StackOverflow https://stackoverflow.com/questions/4577232

  •  14-10-2019
  •  | 
  •  

Frage

Für Klarheit verwende ich C# 3.5/ASP.NET MVC 2

Hier ist, was ich getan habe: Ich wollte die Möglichkeit, ein Objekt zur Laufzeit Funktionen hinzuzufügen/zu entfernen. Deshalb habe ich meiner Klasse einfach ein generisches Objektwörterbuch hinzugefügt:

public Dictionary<int, object> Components { get; set; }

Dann kann ich jedes .NET-Objekt in dieses Wörterbuch zur Laufzeit hinzufügen/entfernen. Um ein Objekt einzufügen, mache ich so etwas:

var tag = new Tag();
myObject.Components.Add((int)Types.Components.Tag, tag);

Dann mache ich das einfach:

if(myObject.Components.ContainsKey((int)Types.Components.Tag))
{    
    var tag = myObject.Components[(int)Types.Components.Tag] as Tag;
    if(tag != null) { //do stuff }
}

Irgendwie fühle ich mich hinterhältig. Es funktioniert in Ordnung, aber ich frage mich, was ihr als bewährte Praxis denkt.

Vielen Dank für Ihren Beitrag, Daniel

War es hilfreich?

Lösung

Ich beschloss, diese Implementierung aufzugeben. Es riecht schlecht für mich.

Stattdessen werde ich das erreichen, was ich in einer ViewModel -Klasse tun muss, die in der Anwendungsschicht lebt. Das ViewModel fungiert als Aggregat für das Domänenmodell und alle anderen Komponenten, die nicht übereinander wissen, sondern eine Beziehung unter dem Domänenmodell haben.

Andere Tipps

Da es sich um ein Wörterbuch handelt und Sie den Schlüssel verwenden, um die Art des Objekts zu implizieren, können Sie nur ein Objekt jedes Typs haben. Warum haben Sie stattdessen nicht einfach ein einzelnes Mitglied von jedem Typ? Dann können Sie nur überprüfen, ob es sich um Null handelt, anstatt sich Sorgen um Aufzählungen und Wörterbücher und Casting zu machen. Es würde auch besser funktionieren. In diesem Fall ist die einfachste Lösung meiner Meinung nach die beste Praxis. Ich würde die Eigenschaft auch dokumentieren, dass Benutzer Ihrer Klasse wissen, dass sie sie so festlegen können, dass sie Funktionen hinzufügen.

Die Eigenschaft:

public Tag TagComponent { get; set; }

Hinzufügen der Komponente:

myObject.TagComponent = new Tag();

Verwendungszweck:

if (TagComponent != null)
{
  //do stuff
}

Das Hauptproblem bei Ihrer Idee ist, dass sie Ihre Klasse seiner statischen Definition beraubt, wodurch die Benutzer ständig erraten werden, wie ihre Funktionen und Komponenten zur Laufzeit liegen.

Ich würde stattdessen so etwas:

public class CoolClassName
{
    private Dictionary<Type, object> _items = new Dictionary<Type, object>();


    public T Get<T>()
    {
        T value;
        if (_items.TryGetValue(typeof(T), out value)
           return (T)value;

        return null;
    }

    public void Set<T>(T value)
    {
        _items[typeof(T)] = value;
    }
}

Verwendungszweck:

coolClass.Set<IUser>(new User{FirstName = "Jonas"});
var user = coolClass.Get<IUser>();

Es ist ein bisschen mehr Type.

Wenn Sie nach einer anderen Lösung suchen, beschreiben Sie bitte genauer, was Sie tun möchten.

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