Hier ist der Code:
public interface IValidator<T>
{
bool IsValid(T obj);
}
public class OrderValidator: IValidator<Order>
{
// ...
}
public class BaseEntity
{
}
public class Order: BaseEntity
{
}
Das Problem ist, dass ich das nicht kann:
var validator = new OrderValidator();
// this line throws because type can't be converted
var baseValidator = (IValidator<BaseEntity>)validator;
// all this is because I need a list with IValidator<Order>, IValidator<BaseOrder>, etc.
IList<IValidator<BaseEntity>> allValidators = ...
Wie erhalte und speichere ich eine Liste aller Implementierungen von IValidator<T> für die Basis T - sagen wir, BaseEntity? Derzeit mache ich nicht-generische IValidator, die "Objekt obj" akzeptiert, aber es ist nicht gut und nicht typsicher.
Das Lustige daran ist, dass C# ermöglicht zu kompilieren:
var test = (IValidator<BaseEntity>)new OrderValidator();
scheitert aber zur Laufzeit mit
Unable to cast object of type 'OrderValidator' to type 'IValidator`1[Orders.Core.BaseEntity]'
Dies ist die gleiche Ausnahme, die Windsor gibt mir (ich habe versucht, sowohl Windsor und manuelle Typen Lookup, dieses Problem ist wirklich nicht im Zusammenhang mit diesem, nur auf die Schnittstellen Casting).
Dank Heinzi weiß ich jetzt, warum ich nicht casten kann - denn IValidator for Order erwartet Order als generischen Typ. Aber wie kann ich eine Liste von IValidator für verschiedene Typen zurückgeben? Der Grund ist, dass die BaseEntity ihren echten Typ nimmt und alle Validatoren sammelt - für alle Typen von GetType() zum Objekt. Ich würde wirklich gerne einen generischen GetValidators() haben und dann darauf operieren.