我得到了我認爲可能是一個不尋常的問題(我已經搜索了很多答案,但我不認爲我找到了一個)。工廠類使用泛型,但沒有基類
我有從隊列中讀取的消息,並根據消息類型包含需要反序列化到具體的c#類的有效載荷。這需要最終是具體的(我不能使用泛型),因爲我使用表達式樹對從隊列到達的類執行評估。
的基類看起來是這樣的:
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)));
}
我實現的基類是這樣的:
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; }
然後我做這樣的事情打電話:
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))
{
什麼我真的很想知道如何創建一個工廠(或者我可以嗎?)來定義基本cl的實現這樣我就可以返回一個具體的類來用於我的表達式樹的評估,而不必重複每個類型的所有調用代碼。
爲什麼「反序列化」實例方法而不是靜態方法?你究竟是在反序列化?我假設了一個'UiTransactionUpdate'。 –
首先想到的是動態類型字段 - >映射到具體類。或者,許多消息傳遞庫將爲您處理針對特定類型的反序列化。 –
我必須反序列化基類型實現的任何類型(直到消息到達時我才知道哪種類型),而UiTransactionUpdate只是許多不同實現中的一種。還有更多的方法是類型特定的,反序列化可能是一個不好的例子,但它是基於我感興趣解決的字符串實例化類型的過程。 – KerSplosh