[英]How to pass a secondary generic parameter to a generic class constructor without a second declare type
這是我第一次得到這個要求,我不知道如何使它工作。 我有一個具有泛型類型的類。 然后構造函數需要獲取該類型的對象。 到現在為止還挺好。 現在,同一個構造函數需要接收第二個泛型類型作為該構造函數的參數,而不必在類中定義第二個泛型類型。 所以這里簡化了一些示例代碼以供理解
// a base class
public class Item {}
// one of many derived class
public class Switch : Item {}
// another class but unrelated to item
public class Sheet {}
// a derived of sheet
public class CoinSheet : Sheet {}
現在我需要一個具有 Item 作為類型的泛型類,因此基本類如下所示,它可以完美運行
public class Manager<T> where T : Item
{
public T RelatedItem { get; set; } = null;
public Manager(T relatedItem)
{
RelatedItem = relatedItem;
}
}
問題是我現在需要將Sheet
類型的對象傳遞給構造函數,而無需在類的泛型中指定它。 以下不起作用,但我的意思是(基於以前的類定義
public class Manager<T> where T : Item
{
public T RelatedItem { get; set; } = null;
public Manager(T relatedItem, T2 relatedSheet) where T2 : Sheet
{
RelatedItem = relatedItem;
InstanceGenerator.Create<T2>(relatedSheet);
}
}
我建議在Manager
類中調用一個方法,該方法可以在不改變Manager
類定義(不能更改)的情況下具有輔助泛型類型,但我得到了一個明確的“否”作為答案。
我知道我可以將第二個參數的參數類型更改為object
並忘記泛型,只需硬編碼檢查object
是否為Sheet
類型並通過反射找到InstanceGenerator.Create
並調用它,但如果它是可以避免的,我寧願這樣做所以。
如果不將其添加到類中,則無法將其添加到構造函數中。
public class Manager<T> where T : Item
{
public T RelatedItem { get; set; } = null;
// THIS IS INVALID
public Manager<T2>(T relatedItem, T2 relatedSheet) where T2 : Sheet
{
RelatedItem = relatedItem;
InstanceGenerator.Create<T2>(relatedSheet);
}
}
這是有道理的。 構造函數只會被調用一次,因此如果要影響方法,更改構造函數中的 T2 沒有意義。
你的兩個真正的選擇是
public class Manager<T> where T : Item
{
public T RelatedItem { get; set; } = null;
public Manager(T relatedItem, Sheet relatedSheet)
{
RelatedItem = relatedItem;
InstanceGenerator.Create<T2>(relatedSheet);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.