die Schnittstelle Gegeben:Deserialisierung des Objekts in Klassenbibliothek unter Inkaufnahme eines Schnittstellenparameter (C#, MVC)
interface IObject
{
public string Name {get;set}
}
Und die folgenden Objekte:
class A: IObject
{
public string Name {get;set}
public int ID {get;set;}
}
class B: IObject
{
public string Name {get;set}
public Guid ID {get;set;}
}
Ich habe zwei nutzenden Anwendungen, die verwenden verschiedene Datenbankschema, aber machen Sie den gleichen Job. Dies ist eine Frage der Pflege einer alten App, während ein Team eine neue schreibt. Voraussetzung ist, dass beide dieselbe Bibliothek verwenden, weshalb dieses Problem besteht. Die Apps rufen beide die gleiche externe API, und dieser Ruf ist in seiner eigenen statischen Klasse und ist wie so zugegriffen:
public static IEnumerable<IObject> List(Guid listUniqueIdentifier)
{
//a custom class to call the API
using (var cmd = new WebApiCommand())
{
//custom enum
cmd.CommandType = ApiComType.GET;
cmd.Command = "ListObjects";
cmd.Filter = listUniqueIdentifier.ToString();
IEnumerable<object> data = cmd.Execute();
var result = new List<IObject>();
foreach(var d in data)
{
result.add(JsonConvert.DeserializeObject<IObject>(Convert.ToString(d)));
}
return result;
}
}
Natürlich können Sie nicht eine Schnittstelle instanziiert, so
result.add(JsonConvert.DeserializeObject<IObject>(Convert.ToString(d)));
Umbrüche . Ich möchte nicht nur versuchen, die GUID-verwendende Version zu erstellen, und wenn es fehlschlägt, verwende die Integer-Version. Nicht nur das ist ein bisschen hacky, aber es ist die neuere DB, die die ganze Zahl verwendet, also würde ich einen try
Block als Flusskontrolle in nur dem schlechtesten möglichen Weg verwenden. Wie kann ich die Deserialisierung für den richtigen Objektinstanztyp (A oder B) durchführen, ohne für jeden Typ unterschiedliche Methoden zu schreiben? Edit: Die Lösungen, die ich gefunden habe, beinhalten normalerweise entweder das Serialisieren des $ -Typs oder das anderweitige Speichern des Instanztyps während der Serialisierung. Dies ist nicht möglich, da die API mit einer Drittanbieteranwendung verbunden ist und dieses Datum nicht speichern kann.