C# 如何将不同的对象传递给同一个函数
我对动态数据有点迷茫,我需要你的帮助。这就是我想做的: 我有以下课程:C# 如何将不同的对象传递给同一个函数,c#,.net,generics,C#,.net,Generics,我对动态数据有点迷茫,我需要你的帮助。这就是我想做的: 我有以下课程: public class SmsMessage : MessageCommonDefinition { public string MessageServiceKey { get; set; } public string MessageAttachments { get; set; } public bool MessageBodyUseTemplate { get; set; } publ
public class SmsMessage : MessageCommonDefinition
{
public string MessageServiceKey { get; set; }
public string MessageAttachments { get; set; }
public bool MessageBodyUseTemplate { get; set; }
public string MessageBodyTemplate { get; set; }
public string MessageBodyTemplateValues { get; set; }
public bool ValidateWithCarrier { get; set; }
public bool IncludeCarrierInfo { get; set; }
}
public class EmailMessage : MessageCommonDefinition
{
public string MessageDisplayName { get; set; }
public string MessageCc { get; set; }
public string MessageBcc { get; set; }
public string MessageSubject { get; set; }
public bool MessageIsBodyHtml { get; set; }
public bool MessageBodyUseTemplate { get; set; }
public string MessageBodyTemplate { get; set; }
public string MessageBodyTemplateValues { get; set; }
public bool IsConfidential { get; set; }
public string MessageAttachments { get; set; }
public MailPriority MessagePriority { get; set; }
}
public abstract class MessageCommonDefinition
{
public Guid MessageId { get; set; }
public string CompanyCode { get; set; }
public string MessageCode { get; set; }
public string MessageChannelCode { get; set; }
public string MessageTo { get; set; }
public string MessageFrom { get; set; }
public string MessageBody { get; set; }
public string ChannelName { get; set; }
}
我还有一个填充模板的方法,该方法接收要填充模板的消息类型(EmailMessage、SmSMessage等),以及其他参数
方法如下:
if (triggerGroup.ToUpper().ToUpper() == AppSettingsKeys.External.ToString().ToUpper())
{
List<PassengerTemplateEntity> passengerTemplateEntity = ACARSRepository.GetPassengerTemplateValues(emailMessage.MessageId);
var passengerTemplateValues = DynamicClassBuilder.BuildObject();
foreach (PassengerTemplateEntity passengerTemplate in passengerTemplateEntity)
{
passengerTemplateValues.AddProperty(passengerTemplate.FieldName, passengerTemplate.FieldData);
}
message.Body = Smart.Format(File.ReadAllText(attFilePath), passengerTemplateValues);
message.Subject = emailMessage.IsConfidential ? SettingsManager.GetAppSettingValue(AppSettingsKeys.ConfidentialKey, "-secmsg-")
+ " " + Smart.Format(emailMessage.MessageSubject.Trim(), passengerTemplateValues) : Smart.Format(emailMessage.MessageSubject.Trim(), passengerTemplateValues);
}
else if (triggerGroup.ToUpper() == AppSettingsKeys.Internal.ToString().ToUpper())
{
alertTemplateValues = CoreRepository.GetExceptionMessage(emailMessage.MessageCode);
if (alertTemplateValues != null)
{
message.Body = Smart.Format(File.ReadAllText(attFilePath), alertTemplateValues);
message.Subject = Smart.Format(emailMessage.MessageSubject.Trim(), alertTemplateValues);
}
else
{
alertTemplateValues = CoreRepository.GetExceptionMessage("E127");
throw new ArgumentException(Smart.Format("BlackBox.{0}: [Exception Code: {1}] {2}", alertTemplateValues.ShortName, alertTemplateValues.ExceptionCode, alertTemplateValues.ExceptionMessage), "ExceptionMessageCode: " + emailMessage.MessageCode, new ArgumentException());
}
}
else
{
alertTemplateValues = CoreRepository.GetExceptionMessage("E123");
throw new ArgumentException(Smart.Format("BlackBox.{0}: [Exception Code: {1}] {2}", alertTemplateValues.ShortName, alertTemplateValues.ExceptionCode, alertTemplateValues.ExceptionMessage), "TriggerGroup: " + triggerGroup, new ArgumentException());
}
if(triggerGroup.ToUpper().ToUpper()==AppSettingsKeys.External.ToString().ToUpper())
{
List passengerTemplateEntity=ACARSRepository.GetPassengerTemplateValues(emailMessage.MessageId);
var passengerTemplateValues=DynamicClassBuilder.BuildObject();
foreach(PassengerTemplateEntity中的passengerTemplate)
{
passengerTemplateValues.AddProperty(passengerTemplate.FieldName,passengerTemplate.FieldData);
}
message.Body=Smart.Format(File.ReadAllText(attFilePath),passengertemplatevalue);
message.Subject=emailMessage.IsConfidential?SettingsManager.GetAppSettingValue(AppSettingsKeys.SecretentialKey,“-secmsg-”)
+“+Smart.Format(emailMessage.MessageSubject.Trim(),passengerTemplateValues):Smart.Format(emailMessage.MessageSubject.Trim(),passengerTemplateValues);
}
else if(triggerGroup.ToUpper()==AppSettingsKeys.Internal.ToString().ToUpper())
{
alertTemplateValues=CoreRepository.GetExceptionMessage(emailMessage.MessageCode);
if(alertTemplateValues!=null)
{
message.Body=Smart.Format(File.ReadAllText(attFilePath),alertTemplateValues);
message.Subject=Smart.Format(emailMessage.MessageSubject.Trim(),alertTemplateValues);
}
其他的
{
alertTemplateValues=CoreRepository.GetExceptionMessage(“E127”);
抛出新ArgumentException(Smart.Format(“BlackBox.{0}:[异常代码:{1}]{2}”)、alertTemplateValues.ShortName、alertTemplateValues.ExceptionCode、alertTemplateValues.ExceptionMessage)、“ExceptionMessageCode:+emailMessage.MessageCode、new ArgumentException());
}
}
其他的
{
alertTemplateValues=CoreRepository.GetExceptionMessage(“E123”);
抛出新ArgumentException(Smart.Format(“BlackBox.{0}:[异常代码:{1}]{2}”)、alertTemplateValues.ShortName、alertTemplateValues.ExceptionCode、alertTemplateValues.ExceptionMessage、“TriggerGroup:+TriggerGroup,new ArgumentException());
}
如您所见,该方法使用emailMessage检索值。我想要实现的是将其用作一个共享函数。我想发送一个泛型参数,不管它是emailMessage还是SmsMessage,并通过发送泛型对象来使用该函数,并用正确的值填充正确的类。问题是什么?我会将其翻转过来。我会添加
公共抽象void SendMessage()
到MessageCommonDefinition
,然后将用于发送每种类型消息的代码放入消息类型类中。您好!谢谢你的回复。我已经这样做了,但是我完成了为每个消息类重复相同的代码。如果我可以通过友好方式发送对象,我可以对所有类别使用相同的方法。这可能吗?@Ray你能用你所做的更新MessageCommonDefinition
。如果您在EmailMessage
和SmsMessage
中都实现了SendMessage()
,那么任何一个实例都只是message.Send()代码>我已经摆脱了代码,但基本上,可能是因为我不理解这个概念,我有更多的不同沟通渠道的类(电子邮件和短信被用作一个例子,以简化事情)。每次我想要发送消息时,我都需要验证是否需要填充填塞物。因此,将为每个不同的实例调用完整的If代码块。如果我使用抽象方法,我如何知道需要发送什么类型的消息,以及如何更改模板。这是一封电子邮件,但我对每封邮件都做了同样的处理。我怎么能只做一次呢?