2017-09-13 87 views
0

我有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

回答

1

繼承是要走的路:

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。 –

0

你可以用我的開源庫,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

1

使用的接口,但是你將不得不作出共同的變化在//..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

這是一個很好的解決方案。應該在這些場景中使用接口。 –

相關問題