如何为泛型类创建工厂

本文关键字:创建 工厂 泛型类 | 更新日期: 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());