如何在一个变量中实现不同的类类型?

问题描述:

我有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); 
} 

任何线索?

+0

继承我推定? –

+0

你可以使用泛型方法吗?我的意思是你可以将'SendData'的定义交换到'SendData ',并通过你的'逻辑'调用闭合的类型。 –

+6

使用接口。 – zzzzBov

继承是要走的路:

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; } 
} 
+0

但是,在功能方法中,我该如何做我的逻辑? – VAAA

+0

你会让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); 
} 
+0

这是一个很好的解决方案。应该在这些场景中使用接口。 –