Ich arbeite mit Dynamics CRM (Was technisch für diese Diskussion irrelevant ist, erklärt aber einige der Hintergrundgeschichte zu diesem Thema). Es gibt zahlreiche Arten, die alle von der Klasse Entity
abgeleitet sind. Ich möchte eine Class<T>() : where T: Entity
erstellen, aber mit einer weiteren Einschränkung, dass es nur für bestimmte Klassen funktioniert, die von Entity
abgeleitet sind.Wie am besten Typen in Generic <T> Klasse einzuschränken, wo alle von der gleichen Basisklasse abgeleitet sind
Meine aktuelle Methode, dies zu tun, ist eine enum
Anpassung der Entitätsnamen ich verwenden möchte, haben, if/else if/else
mich durch diesen Typen und throw
, wenn ein ungültiger Typ übergeben wird.
Es fühlt sich ungeschickt, und ich fühle, dass ich wäre besser dran, etwas zu schreiben, wie,
public class ProductConverter<t> where T: Entity (OpportunityProduct, QuoteProduct, AccountProduct) { ... }
diese Weise wird der Typ-Motor sagen kann: „wir arbeiten an einer Basisklasse von Entity, und auch wir sind nur arbeiten diese abgeleiteten Arten von Unternehmen ".
Ich hoffe, das gibt genug Klarheit, um zu verstehen, was ich tue - mein Ziel ist, dass ich eine Engine erstellen will, die Konvertierung zwischen Entity Records, die erweitert werden können, ohne große Teile des Codes neu schreiben müssen (Effektiv, ein Mapping hinzufügen und Parameter eingeben). Ich bin sicher, es gibt bessere Möglichkeiten, dies zu tun, also zeigen Sie sie bitte, wenn Sie sie sehen :)
@ henk-holterman fragte, ob ich die Klassen ändern könnte. Dies ist nicht möglich, da es sich um generierte Klassendateien handelt, die als Schnittstelle zum Dynamics CRM-Webdienst verwendet werden.
edit
Wie @jamiec erwähnt, sind die Klassen partial
, so kann ich dies tun, indem eine Schnittstelle zu den spezifischen Klassen definieren, ich ändern möchten.
Können Sie die Entitätsklassen ändern? Hinzufügen einer Schnittstelle? Warum gibt es keine Basisklasse "Produkt"? –
Nein, sie sind automatisch als Schnittstellen zum System generiert, ich habe die Kontrolle darüber. Ich werde die Frage aktualisieren. –
Verwenden Sie 'typeof', um den Klassentyp zu testen, dann können Sie eine switch-Anweisung verwenden und für jeden Typ abstrahieren. – bilpor