这是一个思想练习。我不需要帮助简化此代码或完成相同的事情而不关联类型。代码是错综复杂的,因为它试图识别一个可以在替代品不可用时使用的模式。
想法是看一个人是否可以在编译器强制执行的各种类型之间创建任意关系。
我希望能够以相同的方式创建一组与另一组类型{T1, T2, T3, T4, ...}
相关的类型{Ta, Tb, Tc, Td, ... }
。建立关系后,我希望能够使用第二组中的类型,只使用第一组中的相关类型。例如,如果函数被赋予类型T5,它应该能够创建Te的实例,因为T5和Te是相关的。
在下面的示例中,我使用的是{Nail, Screw}
类型,我想将它们与制作者{NailMaker, ScrewMaker}
联系起来。这个思想练习的一个限制是使用类型 Nail来创建NailMaker,而不是使用Nail的实例来创建NailMaker。
目标是能够使用第一组中的类型调用基类Maker
的静态成员,以在第二组中创建相关类型的实例:
var factory = Maker<Nail>.Get()
此处factory
是从NailMaker
派生的Maker<Nail>
的实例,Get()
是静态函数。
我需要以某种方式将NailMaker
与Nail
联系起来,但我还没有办法做到这一点。
类似的东西:
static public Maker<T> Get()
{
return T.GetMaker();
}
我试过这个并且有效:
public abstract class Maker<T>
{
static public Maker<T> Get<T2>() where T2: Maker<T>, new()
{
return new T2();
}
}
但是,我希望它能在不通过T2的情况下工作。
答案 0 :(得分:2)
编辑整个答案,因为它更清晰,更接近您的需要。
首先是Maker
班级(您的T2
)。您可以添加所需的通用属性和方法:
public class Maker
{
public string Name { get; set; } = "";
}
然后是描述部分并包含匹配的Part
类的Maker
父类
public class Part<T> where T : Maker
{
public static Type MakerType { get { return typeof(T); } }
}
然后,您需要1 Maker
来匹配每个Part
,以便创建以下内容:
public class NailMaker : Maker { public NailMaker() { Name = "Nail"; } }
public class ScrewMaker : Maker { public ScrewMaker() { Name = "Screw"; } }
然后我们需要每个Part
以及他们所指的T2
/ Maker
类。
public class Nail : Part<NailMaker> { }
public class Screw : Part<ScrewMaker> { }
然后获取Maker
类只需要Type
中Part
类Static
的实例化,因此无需实例化Part
类
var nailMaker = Activator.CreateInstance(Nail.MakerType);
var screwMaker = Activator.CreateInstance(Screw.MakerType);
答案 1 :(得分:0)
我不确定您将在何处应用它,但是参考Factory pattern您可以实现以下内容:
abstract class Maker {
public abstract int SomeProperty { get; }
}
abstract class MakerFactory {
public abstract Maker GetMaker();
}
class Nail:Maker {
}
class ConcreteNailFactory:NailFactory {
public override Maker GetMaker() {
return new Nail();
}
}