如何为泛型类创建工厂

时间:2016-02-29 15:33:27

标签: c#

我有下一个界面

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;
        }
    }
}

但是竞争者无法将我的clases转换为SomeAbsProperty 什么是正确的行为?

1 个答案:

答案 0 :(得分:1)

您可以使用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());