C# Generische Klassen

heulendoch

Ensign
Registriert
Feb. 2014
Beiträge
252
Hallo zusammen,

folgendes Szenario:

C#:
public abstract class AHandler<T> : ObjectPropertyChanged {
T Config { get; set; }
}
public class Stat1 : AHandler<object> { }
public class Stat2 : AHandler<KlasseX> { }

C#:
var Handlers = new ObservableCollection<AHandler<object>>();
Handlers.Add(Stat1);
Handlers.Add(Stat2);

erzeugt folgenden Fehler:
Fehler CS1503 Argument "1": Konvertierung von "Stat2" in "AHandler<object>" nicht möglich.

Da aber KlasseX wie alle Klassen ja bekanntlich von object ableitet, versteh ich nicht, weshalb er mir hier einen Fehler bringt. Was wäre denn hierfür die Lösung?
<T> kann jedes beliebige von mir implementierte ViewModel sein, ich habe entsprechende DataTemplates geschrieben die zu den ViewModels passen. Die ViewModels implementieren gewisse Filter, ein anderes ViewModel hat andere Eigenschaften/Methoden, weshalb ich als <T> kein Interface angeben kann. Wenn <T> lediglich object ist (in z. B. Stat1), dann auch null ist, wird das Control zum Konfigurieren von Stat1 auch überhaupt nicht dargestellt.

Ich hoffe ich habe mich nicht zu kompliziert ausgedrückt.
Ergänzung ()

Kann ich den Titel nicht mehr ändern? Wollte ihn noch etwas spezifizieren..
 
Zuletzt bearbeitet:
Du kannst für sowas ein Kovariantes Interface nutzen. https://docs.microsoft.com/de-de/do...avariance/creating-variant-generic-interfaces

Der Knackpunkt in deiner Implementierung ist, dass der Setter für Stat2 nicht genutzt werden darf. Du kannst Stat2 halt nicht ein object zuweisen, weil es KlasseX erwartet. Mit einem kovarianten stellst du sicher, dass es keinen Eingabeparameter vom Typ T geben darf (im Interface).

C#:
public interface IHandler<out T> {
  T Config {get;}
}

public class AHandler<T> : IHandler<T> {
  public T Config { get; set; }
}

public class Stat1 : AHandler<object> { }
public class Stat2 : AHandler<String> { }

public static void Main(string[] arg) {
  var Handlers = new List<IHandler<object>>();
  Handlers.Add(new Stat1());
  Handlers.Add(new Stat2());
}

Schöner kriege ich es auf den Handy nicht formatiert 😅
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: heulendoch
AHandler<KlasseX> ist nunmal keine Unterklasse von AHandler<object> (Auch wenn KlasseX Unterklasse von object ist).
 
  • Gefällt mir
Reaktionen: heulendoch
Hatte mir das direkt am Freitag noch angeschaut und der Tipp von @Ocram1992 war genau das was ich suchte. Dankeschön!
 
Zurück
Oben