Ive bekam, was ich denke, kann ein ungewöhnliches Problem sein (Ive um eine Menge für eine Antwort gesucht, aber ich glaube nicht, dass Ive eine gefunden).Factory-Klasse unter Verwendung von Generika, aber ohne Basisklasse
Ich habe Nachrichten, die aus einer Warteschlange und in Abhängigkeit von dem Nachrichtentyp gelesen werden, enthält eine Nutzlast, die in eine Beton deserialisiert C# Klasse werden muss. Dies muss schließlich konkret sein (ich kann Generika nicht den ganzen Weg verwenden), weil ich Expression Trees verwende, um Bewertungen für die Klassen durchzuführen, die aus der Warteschlange kommen.
Die Basisklasse sieht wie folgt aus:
public abstract class BaseRuleMessage<T>
{
public abstract Func<T, bool> CompileRule(Rule r, T msg);
public T Deserialize(ClientEventQueueMessage message)
{
return JsonConvert.DeserializeObject<T>(message.Payload);
}
public BaseRuleMessage()
{
RulesCompleted = new List<int>();
}
public IEnumerable<Rule> FilterRules(RuleGroup ruleGroup)
{
return ruleGroup.Rules.Where(item =>
!RulesCompleted.Any(r => r.Equals(item.Id)));
}
ich die Basisklasse wie folgt implementieren:
public class UiTransactionUpdate : BaseRuleMessage<UiTransactionUpdate>
{
public override Func<UiTransactionUpdate, bool> CompileRule(Rule r, UiTransactionUpdate msg)
{
var expression = Expression.Parameter(typeof(UiTransactionUpdate));
Expression expr = BuildExpr(r, expression, msg);
return Expression.Lambda<Func<UiTransactionUpdate, bool>>(expr, expression).Compile();
}
public Guid TransactionId { get; set; }
public Guid GroupId { get; set; }
public decimal StatusValue { get; set; }
ich dann so etwas tun zu nennen:
switch (message.MessageType)
{
case "UI_UPDATE":
{
message.Payload = RemoveNullGroupIdReference(jsonPayload, message.Payload);
var deserializedMessage = new UiTransactionUpdate().Deserialize(message);
deserializedMessage.RulesCompleted = deserializedMessage.RulesCompleted ?? new List<int>();
foreach (var rule in deserializedMessage.FilterRules(ruleGroup))
{
Was Ich möchte wirklich wissen, wie kann ich eine Fabrik erstellen (oder kann ich?), Um die Implementierung der Basis cl zu definieren ass so, dass ich eine konkrete Klasse für meine Ausdrucksbaumauswertungen zurückgeben kann, ohne den gesamten aufrufenden Code für jeden Typ wiederholen zu müssen.
Warum ist 'eine Instanzmethode und kein statisches Verfahren Deserialize'? Was enteralisierst du eigentlich? Ich hatte ein "UITransactionUpdate" angenommen. –
Die erste Sache, die in den Sinn kommt, ist dynamisch mit Typ-Feld -> auf konkrete Klasse zugeordnet. Alternativ können viele Nachrichtenübergabebibliotheken die Deserialisierung für bestimmte Typen übernehmen. –
Ich muss jeden Typ deeserialize, den der Basistyp implementiert (ich weiß nicht welcher Typ, bis die Nachricht ankommt) und UiTransactionUpdate ist nur eine von vielen verschiedenen Implementierungen. Es gibt mehr Methoden, die typspezifisch sind und deserialize könnte ein schlechtes Beispiel sein. Aber es ist der Prozess der Instanziierung eines Typs basierend auf einer Zeichenfolge, die ich lösen möchte. – KerSplosh