簡體   English   中英

如何根據C#中的IF返回不同的對象(泛型)

[英]How to return a different object depending on IF in C# (Generics)

我有一個ASP.NET MVC(非核心)項目,遇到了一些問題,我認為終於可以開始學習如何正確使用泛型,這可以解決我的問題。

我的情況是我有一個SQL連接,該連接返回數據,並且根據SQL中一個字段的結果,我想使用兩種不同的模型。 這些模型具有許多共同的屬性,因此我認為最佳實踐是創建一種方法,該方法選擇要創建的模型,填充差異,返回模型,然后繼續填充“公共”屬性。

我嘗試閱讀有關泛型的內容,但是我對此很陌生,因此我沒有取得太大進展。

我的代碼示例如下所示:

public ResultVM MainClass()
{
    var resultData = new ResultVM();

    // ... SQL returns data

    while (reader.Read())
    {
        resultData.Add(reader);
    }

    return resultData;
}

public object CreateObject(SqlDataReader indata)
{

    if((indata["Associate"].ToString()) == "0")
    {
        var individual = new Individual();
    }
    else
    {
        var group = new Group();
    }

    return object;
}

如何動態地(取決於“ Associate字段的值)創建個人或組?

如何實現具有所有通用屬性的接口?

就像是

interface IInterface
{
    string CommonProperty1 { get; set; }
    string CommonProperty2 { get; set; }
}

class Individual : IInterface
{
    // ...
}

class Group : IInterface
{
    // ...
}

public IInterface CreateObject(SqlDataReader indata)
{
    if((indata["Associate"].ToString()) == "0")
    {
        var individual = new Individual();
        // ...  
        return individual;
    }
    else
    {
        var group = new Group();
        // ...
        return group;
    }
}

我建議您直接使用System.Type 根據您的實際需求,這里可以有多種更優雅的解決方案:

  1. indata.GetFieldType(int ordinal)將返回您字段的.NET類型
  2. 使用類型處理序列化數據 ,然后您可以在非通用反序列化之后簡單地獲取類型。 例如:

     var result = JsonConvert.DeserializeObject(dataJson); 

result將具有您實際對象類型的類型。 您可以檢查它是否寫入result.GetType()並創建此類型的對象。 有關更高級的用法,請參見Activator.CreateInstance(...)

  1. 在大多數情況下,使用接口是最好的方法:

     interface ISomething { // ... } class Individual : ISomething { // ... } class Group : ISomething { // ... } 

然后,您以這種方式構建非泛型方法:

public ISomething CreateObject(SqlDataReader indata) 
{
    if((indata["Associate"].ToString()) == "0")
        return new Individual();
    else
        return new Group();
}

您的通用對象創建可能看起來像這樣:

public T CreateObject<T>(SqlDataReader indata) 
{
    var o = new T();
    return o;
}

其中T是類型,您可以在此方法之外傳遞: CreateObject<YourType>(indata) T可以是您想要的任何類型,包括接口。 還與仿制葯的工作,你可以通過使用要檢查類型is關鍵字,但我建議使用接口,避免is檢查的。 例:

if(yourObject is YourType)
{
    (yourObject as YourType).SomeSpecificToYourTypeMethod();
    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM