如何为泛型类创建工厂
本文关键字:创建 工厂 泛型类 | 更新日期: 2023-09-27 18:36:47
我有下一个界面
public interface IProperty<T>
{
T Data { get; set; }
}
public abstract class SomeAbsProperty<T> : IProperty<T> where T : class
{
protected SomeAbsProperty(int param1) {}
public abstract T GetData();
public I Data { get; set; }
}
我有基于SomeAbsProperty类的childres类列表它们看起来像(简单的例子)
public sealed class ChildrenProperties : SomeAbsProperty<SomeClasss>
{
public ChildrenProperties(int param1):base(param1) {}
public override object GetData()
{
return new SomeClasss()
}
}
我想要一些工厂来构建基于某种类型的特定类
public static class MyFactory
{
public static SomeAbsProperty<T> CreateObject<T>(PropertyName property) where T : class
{
switch (property)
{
case PropertyName.p1:
return new ChildrenProperties1(siteSettings, packageDateContext);
case PropertyName.p2:
return new ChildrenProperties(siteSettings, packageDateContext);
case PropertyName.p3:
return new ChildrenProperties2(siteSettings, packageDateContext);
case PropertyName.p4:
return new ChildrenProperties3(siteSettings, packageDateContext);
default:
return null;
}
}
}
但强制者无法将我的扣子转换为某些AbsProperty这里正确的行为是什么?
您可以使用
as
强制转换来SomeAbsProperty<T>
泛型类,如下所示
return new ChildrenProperties(10) as SomeAbsProperty<T>;
当然,你必须确定 ChildrenProperties 确实是 SomeAbsProperty(如果你编写了基类和工厂类,你就知道它是)。不能使用显式编译时强制转换。
编辑:如果创建实例的工厂仅依赖于泛型参数,也许会更好(这仅在所有专用化具有不同的参数 T 时才有效;我不确定这是否是你的情况)。像这样:
public static SomeAbsProperty<T> CreateObject<T>() where T : class
{
Type type = typeof(T);
if (type == typeof(object))
{
return new ChildrenProperties() as SomeAbsProperty<T>;
}
else if (type == typeof(string))
{
return new ChildrenPropertiesString() as SomeAbsProperty<T>;
}
else
{
return null;
}
}
。然后你可以用类似的东西调用工厂:
SomeAbsProperty<object> h = MyFactory.CreateObject<object>();
Console.WriteLine(h.GetType().ToString());
SomeAbsProperty<string> h2 = MyFactory.CreateObject<string>();
Console.WriteLine(h2.GetType().ToString());