C# 如何在没有第二个声明类型的情况下将第二个泛型参数传递给泛型类构造函数

C# 如何在没有第二个声明类型的情况下将第二个泛型参数传递给泛型类构造函数,c#,generics,C#,Generics,这是我第一次得到这个要求,我不知道如何使它工作。 我有一个具有泛型类型的类。然后构造函数需要获取该类型的对象。到现在为止,一直都还不错。现在,同一个构造函数需要接收第二个泛型类型作为该构造函数的参数,而不必在类中定义第二个泛型类型。因此,这里有一些简化的示例代码,以便于理解 // a base class public class Item {} // one of many derived class public class Switch : Item {} // another cla

这是我第一次得到这个要求,我不知道如何使它工作。 我有一个具有泛型类型的类。然后构造函数需要获取该类型的对象。到现在为止,一直都还不错。现在,同一个构造函数需要接收第二个泛型类型作为该构造函数的参数,而不必在类中定义第二个泛型类型。因此,这里有一些简化的示例代码,以便于理解

// 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 {}
现在我需要一个泛型类,它有一个作为类型的项,这样一个基本类将如下所示,并且它可以完美地工作

public class Manager<T> where T : Item
{
    public T RelatedItem { get; set; } = null;
    
    public Manager(T relatedItem)
    {
        RelatedItem = relatedItem;
    }
}
我建议在
Manager
类中调用一个方法,该方法可以在不改变
Manager
类定义(不能更改)的情况下具有第二泛型类型,但我得到了一个明确的否定答案


我知道我可以将第二个参数的参数类型更改为
对象
,而不必考虑泛型,只需硬编码检查
对象
是否属于
类型,并通过反射找到
实例生成器。创建
并调用它,但如果可以避免,我宁愿这样做。

如果不添加如果将其添加到类中,则不能将其添加到构造函数中

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);
    }
}
公共类管理器,其中T:Item
{
公共T RelatedItem{get;set;}=null;
//这是无效的
公共经理(T相关项目,T2相关表格),其中T2:表格
{
RelatedItem=RelatedItem;
InstanceGenerator.Create(relatedSheet);
}
}
这是有道理的。构造函数只会被调用一次,因此如果改变构造函数中的T2会影响方法,那么改变它就没有意义了

你的两个真正的选择是

  • 直接使用纸张
  • 公共类管理器,其中T:Item
    {
    公共T RelatedItem{get;set;}=null;
    公共经理(T相关项目,表格相关表格)
    {
    RelatedItem=RelatedItem;
    InstanceGenerator.Create(relatedSheet);
    }
    }
    
  • 将在类级别上添加T2

  • 如果第二个参数必须是
    工作表
    ,那么它必须是泛型的还是只能是
    工作表
    ?@ScottHannen我确实需要一个泛型才能调用第二个方法。如果我硬编码
    InstanceGenerator.Create(relatedSheet)该方法不起作用。我需要实际类型,因为它有不同的行为。因此,我说我可以传递一个对象,并通过反射找到与传递的类型匹配的正确泛型方法。泛型的优点是我可以直接调用另一个泛型,同时也应用了类型强制<代码>公共类管理器
    和将
    T2
    约束为
    工作表
    ?您不能创建一个通用工厂方法而不是使用构造函数吗?@AlexandruClonțea如果您这样做,您仍然必须知道类型,这是通用约束非常适合的。这就是我担心可以避免的。但是,如果这真的不可能,我没有选择正常地传递对象并对所有子调用使用反射。谢谢你的精神检查。
    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);
        }
    }
    
    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);
        }
    }