我有下一个界面
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 什么是正确的行为?
答案 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());