Das Hauptproblem bei dieser Frage besteht darin, dass wir T in eine Funktion übergeben und es verwenden, um ein Objekt wie die folgende Anweisung zu formen.
void SomeFunction<T> (object model)
{
(SomeClass<T>)model;
}
Alles funktioniert einwandfrei. Aber ich möchte das Modellobjekt in ein generisches Klassenobjekt umwandeln, das ein Elternteil von T oder ein Großelternteil von T ist, je nachdem, was nicht leer ist. Wie das zu tun?
Aktualisiert # 1
Zum besseren Verständnis sehen Sie sich bitte das folgende Beispiel an.
public partial class SimpleUserInfo
{
public string LogOnName { get;set; }
public string HashedPassword { get;set; }
}
public partial class UserInfo : SimpleUserInfo
{
pubic string Address { get;set; }
}
Nachdem ich einige Datenmodelle erstellt habe. Ich erstelle einige generische Klasse, die UserInfo Klasse als Parameter verwenden.
public class SimpleUserInfoValidator : IValidator<SimpleUserInfo>
{
// logic to validate simple user info instance
}
Und dann füge ich der Klasse SimpleUserInfo ein Attribut hinzu.
[Validator(typeof(SimpleUserInfoValidator))]
public partial class SimpleUserInfo {}
Schließlich erstelle ich eine Funktion zum Abrufen des Validators in der gegebenen Klasse T.
public GetValidator<T> ()
{
var attribute = (ValidatorAttribute)Attribute.GetCustomAttribute(type, typeof(ValidatorAttribute));
if (attribute == null || attribute.ValidatorType == null)
return null;
var (IValidator<T>)Activator.CreateInstance(attribute.ValidatorType);
}
Diese Funktion funktioniert gut, wenn T SimpleUserInfo ist, aber das Problem wird auftreten, wenn T UserInfo ist. Wie lässt sich das Problem lösen?
PS. Um diese Frage zu lösen, ist es nicht erforderlich, neue Funktion von C# 4.0 zu verwenden. Aber ich sage Ihnen nur über ich werde diese Lösung in C# 4.0 anwenden.
Danke,