我有兩個父類:Item
和ItemData
. 從第一個開始,我制作了諸如之類的專案WeaponItem
,從第二個開始,我制作了相應的資料,例如WeaponData
。
每個專案型別在其建構式中采用相同型別的資料(例如:創建WeaponItem
時需要WeaponData
)。
我有以下方法:
public static T CreateNewItem<T, DT>(ItemData data) where T : Item where DT : ItemData
{
if (data == null) return null;
if (data is DT dt)
{
//determine type of T
Type itemType = typeof(T);
if (itemType = typeof(WeaponItem))
{
//make a new weapon item...
WeaponItem new_weapon = new WeaponItem(dt); //error!
return new_weapon;
}
if (itemType = typeof(ArmorItem))
{
//make a new armor item...
}
//etc...
}
return null;
}
我這樣稱呼它:
CreateNewItem<WeaponItem, WeaponData>(data);
注意:data
是型別ItemData
或某些繼承型別(例如。WeaponData
)。
此方法需要兩種型別:一種用于Item
,一種用于ItemData
。我有幾件物品(武器、盔甲等),我根據我給出的型別創建了這些物品。我還想檢查我使用的資料:從我傳遞的資料data is DT dt
中獲取,或者如果轉換失敗。WeaponData
null
當我嘗試這樣做時WeaponItem new_weapon = new WeaponItem(dt);
,出現以下錯誤:
引數 1:無法從 'DT' 轉換為 'WeaponData' [Assembly-CSharp]csharp(CS1503)
我試著像dt
這樣WeaponData
:WeaponItem new_weapon = new WeaponItem((WeaponData)dt);
,但我得到了一個類似的錯誤
無法將型別“DT”轉換為“WeaponData”[Assembly-CSharp]csharp(CS0030)
同樣,使用data
代替dt
會產生錯誤。
是否可以在不每次檢查型別的情況下解決此問題?
uj5u.com熱心網友回復:
你的設計對我來說有點反直覺,所以讓我們從一個非常簡單的泛型方法版本開始,然后從那里開始。您可以復制和編譯此代碼。
您也可以單擊此鏈接,然后單擊“運行”按鈕。
我想說這里最大的優勢是通用方法變成了一行代碼。您可以根據需要添加任意數量的專案,并且永遠不要更改該方法。而您的實作變得越來越復雜。
代碼:
public class ItemData
{
public string ItemName { get; init; }
}
public class WeaponData : ItemData { }
public class Item
{
public ItemData Data { get; init; }
public Item(ItemData data)
{
Data = data;
}
}
public class WeaponItem : Item
{
public WeaponItem(WeaponData data) : base(data) { }
public override string ToString() => Data.ItemName;
}
public static T CreateNewItem<T, TD>(TD data)
where T : Item
where TD : ItemData
{
return (T)Activator.CreateInstance(typeof(T), data);
}
static void Main(string[] args)
{
var bestWeaponDataEver = new WeaponData() { ItemName = "Dragon Slayer" };
var amazingWeapon = CreateNewItem<WeaponItem, WeaponData>(bestWeaponDataEver);
Console.WriteLine(amazingWeapon);
}
輸出:
屠龍者
另一個很大的區別是您接受的特定型別ItemData
應該是泛型型別DT
。否則為什么還會 DT
存在?這可能讓你絆倒了。
public static T CreateNewItem<T, DT>(ItemData data) where T : Item where DT : ItemData
應該是這個
public static T CreateNewItem<T, DT>(DT data) where T : Item where DT : ItemData
請注意WeaponItem
僅接受的建構式WeaponData
。因此,盡管有簡單的通用方法,但您無法使用底座ItemData
或CakeData
其他任何東西來創建武器。
如果您不確定如何擴展此評論,我會盡力提供幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470410.html
上一篇:golang1.18中的逆變型別如何與泛型一起作業?
下一篇:使用通用函式復制不重復