如何在一个变量中实现不同的类类型?
我有3个对象类:如何在一个变量中实现不同的类类型?
public class MessageData
{
public string MessageID { get; set; }
public string Date { get; set; }
public bool IsSent { get; set; }
public string EmployeeInfo { get; set; }
}
public class MultiMessageData
{
public string MessageID { get; set; }
public string Date { get; set; }
public bool IsSent { get; set; }
public byte MessageType { get; set; }
public string MessageType { get; set; }
public string Platform { get; set; }
public string EmployeeInfo { get; set; }
}
public class SocialData
{
public string MessageID { get; set; }
public string Date { get; set; }
public bool IsSent { get; set; }
public bool IsReceived { get; set; }
public byte MessageType { get; set; }
public string MessageType { get; set; }
public string Message { get; set; }
public string UserName { get; set; }
}
然后,我有一个功能,现在只实现MessageData类:
public void SendData()
{
List<MessageData> data = new List<MessageData>();
// some work here with data variable...
_sendRepository.Send(data);
}
现在我需要的是让大部分的逻辑,但一种方式我可以实例化一个变量,可以是任何类的类型,例如:
public void SendData()
{
var data;
if(logic == 1){
data = new List<MessageData>();
} else if(logic == 2){
data = new List<MultiMessageData>();
}else {
data = new List<SocialData>();
}
// some work here...
// if I do that then this Send method I will change it to be a Generic T maybe.
_sendRepository.Send(data);
}
任何线索?
继承是要走的路:
public class MessageDataBase
{
public string MessageID { get; set; }
public string Date { get; set; }
public bool IsSent { get; set; }
}
public class MessageData : MessageDataBase
{
public string EmployeeInfo { get; set; }
}
public class MultiMessageData : MessageDataBase
{
public byte MessageType { get; set; }
public string MessageTypeString { get; set; }
public string Platform { get; set; }
public string EmployeeInfo { get; set; }
}
public class SocialData : MessageDataBase
{
public bool IsReceived { get; set; }
public byte MessageType { get; set; }
public string MessageTypeString { get; set; }
public string Message { get; set; }
public string UserName { get; set; }
}
但是,在功能方法中,我该如何做我的逻辑? – VAAA
你会让Send方法接受一个MessageDataBase的参数,这样它就可以从MessageDataBase继承任何Message。 –
你可以用我的开源库,OneOf https://github.com/mcintyre321/OneOf
一个OneOf是一种特殊类型,可以从一系列类型有一个值,如F#中的歧视联盟。它提供了使用继承/多态的替代方法。
你会写你的方法是这样的:
public void SendData()
{
OneOf<List<MessageData>, List<MultiMessageData>, List<SocialData>> data = null;
if(logic == 1){
data = new List<MessageData>();
} else if(logic == 2){
data = new List<MultiMessageData>();
}else {
data = new List<SocialData>();
}
// some work here...
_sendRepository.Send(data);
}
或者你可以有var data = List<OneOf<MessageData, MultiMessageData, SocialData>>();
,如果你喜欢,特别是如果你想在列表中不同类型的 。
安装包OneOf
它支持net451和netstandard1.6
使用的接口,但是你将不得不作出共同的变化在//..do some work here section
public interface IMessageData
{
//Example required function for all MessageData classes
void SetDate(DateTime date);
void SetIsSent(bool date);
}
public abstract class BaseMessageData : IMessageData
{
public string MessageID { get; set; }
public string Date { get; set; }
public bool IsSent { get; set; }
public BaseMessageData(string messageID)
{
MessageID=messageID;
}
public void SetDate(DateTime date)
{
Date = date.ToString("MM/dd/yyyy");
}
public void SetIsSent(bool sentStatus)
{
IsSent = sentStatus;
}
}
public class MessageData : BaseMessageData, IMessageData
{
public string EmployeeInfo { get; set; }
}
public class MultiMessageData : MessageData,IMessageData
{
public byte MessageType { get; set; }
public string MessageType { get; set; }
public string Platform { get; set; }
}
public class SocialData : BaseMessageData, IMessageData
{
public bool IsReceived { get; set; }
public byte MessageType { get; set; }
//Can't have to properties named the same.
//public string MessageType { get; set; }
public string Message { get; set; }
public string UserName { get; set; }
}
然后在你的SendData
public void SendData()
{
List<IMessageData> data;
if (logic == 1)
{
data = new List<MessageData>();
}
else if (logic == 2)
{
data = new List<MultiMessageData>();
}
else
{
data = new List<SocialData>();
}
// some work here...
foreach (var d in data)
{
//Only methods that will work are ones declared in the IMessageData interface
d.SesDate(DateTime.Now);
d.SetIsSent(true);
}
// if I do that then this Send method I will change it to be a Generic T maybe.
_sendRepository.Send(data);
}
这是一个很好的解决方案。应该在这些场景中使用接口。 –
继承我推定? –
你可以使用泛型方法吗?我的意思是你可以将'SendData'的定义交换到'SendData',并通过你的'逻辑'调用闭合的类型。 –
使用接口。 – zzzzBov