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