[英]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.