Ive는 비정상적인 문제 일 수 있다고 생각합니다 (Ive는 답을 찾기 위해 많이 찾았지만 Ive는 하나를 찾은 것 같아요).제네릭을 사용하지만 기본 클래스가없는 팩토리 클래스
대기열에서 읽은 메시지가 있고 메시지 유형에 따라 구체적인 C# 클래스로 직렬화가 필요없는 페이로드가 포함되어 있습니다. 표현식 트리를 사용하여 대기열에서 도착한 클래스에 대한 평가를 수행하기 때문에 결과적으로 구체적이어야합니다 (전체적으로 제네릭을 사용할 수 없습니다).
는 기본 클래스는 다음과 같습니다 : 다음 호출 같은 것을 할
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; }
:
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)));
}
나는이 같은 기본 클래스를 구현
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'를 가정했다. –
가장 먼저 떠오르는 것은 콘크리트 클래스에 매핑 된 유형 필드로 동적입니다. 또는 여러 메시지 전달 라이브러리가 특정 유형의 직렬화를 처리합니다. –
기본 유형을 구현하는 모든 유형을 deserialize해야합니다 (메시지가 도착할 때까지 어떤 유형인지 알지 못합니다). UiTransactionUpdate는 다양한 구현 중 하나입니다. 특정 유형의 메소드가 더 있고 deserialize가 나쁜 예일 수 있습니다. 그러나 해결하고자하는 문자열을 기반으로 유형을 instanciating하는 프로세스입니다. – KerSplosh