我有以下问题:
我有一个静态工厂类和一堆产品类
Factory类应该被赋予一堆String Vectors,并且能够将Product Object作为BaseProductClass返回。
所以我基本上会给Factory类提供参数" banana",#34; green"和"新鲜"它会将绿色的新鲜香蕉作为产品类别返回
我遇到的问题是Factory类不应该技术上知道所有Product类,只知道Product基类。但它应该有一个Type数组,其中所有Product类都存储为泛型类型,用识别它们的字符串进行协调(或者字符串是类的一部分,可以某种方式提取)。
它应该只能获取第一个字符串参数,将其连接到一个类型,然后将此类型发送到String数组并让它自己初始化。
在最后我应该能够创建新的产品类,并将它们输入到通用类型阵列中 有谁知道最优雅的方法来实现这样的东西?
答案 0 :(得分:0)
每个产品类都需要拥有自己的工厂,例如,它是从private static readonly Dictionary<Type, Expression> Mappings =
new Dictionary<Type, Expression>
{
{ typeof(ViewModelA),
Helper<ViewModelA>(x => new ViewModelA { Something = x.Something }) },
{ typeof(ViewModelB),
Helper<ViewModelB>(x => new ViewModelB { SomethingElse = x.SomethingElse }) },
...
}
// This method just helps avoid casting all over the place.
// In C# 6 you could use an expression-bodied member - or add a
private static Expression<Func<CustomType, T>> Helper<T>
(Expression<Func<CustomType, T>> expression)
{
return expression;
}
public static T AsViewModel<T>(this IQueryable<CustomType> query)
{
Expression rawMapping;
if (!Mappings.TryGetValue(typeof(T), out rawMapping))
{
throw new InvalidOperationException("Or another exception...");
}
// This will always be valid if we've set up the dictionary properly
var mapping = (Expression<Func<CustomType, T>>) rawMapping;
return view.Select(mapping).FirstOrDefault();
}
类继承的。该类声明了一个虚拟BaseProductFactory
方法,例如,通过构造该类的新实例在子类中实现的方法。
您的&#34;通用类型阵列&#34;将产品名称映射到指向相应产品类的指针&#39; BaseProductClass *create()
实例。
除了产品类别之外,您基本上对工厂进行了类型擦除。