簡體   English   中英

如何在沒有第二個聲明類型的情況下將輔助泛型參數傳遞給泛型類構造函數

[英]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 沒有意義。

你的兩個真正的選擇是

  1. 直接使用Sheet。
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);
    }
}
  1. 要在班級級別添加的 T2。

暫無
暫無

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

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