Ich habe 3 Klassen, die im Wesentlichen die gleichen sind, aber keine Schnittstelle implementieren, da sie alle aus verschiedenen Webdiensten stammen.C# Generics: Kann ich auf eine Reihe von Klassen beschränken, die keine Schnittstelle implementieren?
z.B.
- Service1.Object1
- Service2.Object1
- Service3.Object1
Sie alle haben die gleichen Eigenschaften und ich einige Code schreibe sie miteinander zu kartieren ein Zwischenobjekt unter Verwendung der meine eigene Schnittstelle implementiert IObject1
ich habe dies mit Generika getan
public static T[] CreateObject1<T>(IObject1[] properties)
where T : class, new()
{
//Check the type is allowed
CheckObject1Types("CreateObject1<T>(IObject1[])", typeof(T));
return CreateObjectArray<T>(properties);
}
private static void CheckObject1Types(string method, Type type)
{
if (type == typeof(Service1.Object1)
|| type == typeof(Service2.Object1)
|| type == typeof(Service3.Object1)
|| type == typeof(Service1.Object1[])
|| type == typeof(Service2.Object1[])
|| type == typeof(Service3.Object1[]))
{
return;
}
throw new ArgumentException("Incorrect type passed to ServiceObjectFactory::" + method + ". Type:" + type.ToString());
}
Mein Client-Code wie folgt aussieht:
//properties is an array of my intermediary objects
Object1[] props = ServiceObjectFactory.CreateObject1<Object1>(properties);
Was will ich tun ist, der CheckObject1Types Methode loszuwerden und stattdessen Einschränkungen verwenden, so dass ich einen Build-Fehler erhalten, wenn die Typen nicht gültig sind, denn bei Sobald ich diese Methode mit einem beliebigen Typ aufrufen kann, wird die ArgumentException von der CheckObject1Types-Methode ausgelöst.
So würde Ich mag, wie etwas zu tun ist:
public static T[] CreateObject1<T>(IObject1[] properties)
where T : class, new(), Service1.Object1|Service2.Object1|Service3.Object1
{
return CreateObjectArray<T>(properties);
}
Irgendwelche Ideen?
Bearbeiten: Ich möchte nicht die Reference.cs-Dateien für jeden Webservice ändern, weil alles was es braucht, ein Teamkollege ist, um die Web-Referenz und BAM zu aktualisieren! gebrochener Code.
Mir ist gerade aufgefallen, dass ich die Effizienz des Prüfcode verbessern kann, indem ich ihn von && auf || ändere und! = to == bevor jemand darauf hinweist. –