簡體   English   中英

如何聲明包含泛型類型的數組?

[英]How to declare an array containing generic type?

說我有以下類型:

public class Field<T>
{
  public string Name { get; set; }
  public T Value { get; set; }
}

如何聲明包含此類字段數組的變量? 我嘗試了以下方法:

var customFields = new Field[]
{
    new Field<string> { Name = "nickname", Value = "Bob" },
    new Field<int> { Name = "age", Value = 42 },
    new Field<DateTime> { Name = "customer_since", Value = new DateTime(2000, 12, 1) }
};

但我得到以下編譯時異常:

使用泛型類型“Field”需要1個類型參數

我也嘗試了var customFields = new Field<object>[]但是我收到以下錯誤:

無法隱式將“Field”類型轉換為“Field”

無法隱式將“Field”類型轉換為“Field”

無法隱式將“Field”類型轉換為“Field”

正如Matias所說,不能這樣做,因為Field<int>Field<string>是完全不同的類型。 你能做的是:

創建一個非泛型的基本Field

public class Field
{
    public string Name { get; set; }
}

public class Field<T> : Field
{
    public T Value { get; set; }
}

接着:

var customFields = new Field[]
{
    new Field<string> { Name = "nickname", Value = "Bob" },
    new Field<int> { Name = "age", Value = 42 },
    new Field<DateTime> { Name = "customer_since", Value = new DateTime(2000, 12, 1) }
};

正如馬蒂亞斯評論的那樣,需要一個向下轉型才能獲得不同類型的Value 如果對於每種不同類型的Value都有一個特定的邏輯要執行,處理它的一個好方法是使用Factory設計模式。 工廠將為每個Field返回一個正確的“ FieldHandler<T> ”,它將向下轉換,執行操作並返回所需的內容。

您可以做的另一件事是簡單地為所有這些類型使用公共基類 - 對象。

class Field
{
    public string Name { get; set; }
    public Object Value { get; set; }
}
var customFields = new Field[]
{
    new Field { Name = "nickname ", Value = "Bob" },
    new Field { Name = "age", Value = 42 },
    new Field { Name = "customer_since", Value = new DateTime(2000, 12, 1) }
};

但是,這會將某些類型處理卸載到customFields的使用者,但如果已知與特定字段名稱關聯的Value類型,則應該沒問題。

暫無
暫無

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

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