我得到了我认为可能是一个不寻常的问题(我已经搜索了很多答案,但我不认为我找到了一个)。工厂类使用泛型,但没有基类
我有从队列中读取的消息,并根据消息类型包含需要反序列化到具体的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