如何创建可以使用字符串参数自动初始化其他类的类

时间:2016-03-31 15:33:04

标签: c++ oop inheritance types

我有以下问题:
我有一个静态工厂类和一堆产品类 Factory类应该被赋予一堆String Vectors,并且能够将Product Object作为BaseProductClass返回。

所以我基本上会给Factory类提供参数" banana",#34; green"和"新鲜"它会将绿色的新鲜香蕉作为产品类别返回 我遇到的问题是Factory类不应该技术上知道所有Product类,只知道Product基类。但它应该有一个Type数组,其中所有Product类都存储为泛型类型,用识别它们的字符串进行协调(或者字符串是类的一部分,可以某种方式提取)。
它应该只能获取第一个字符串参数,将其连接到一个类型,然后将此类型发送到String数组并让它自己初始化。

在最后我应该能够创建新的产品类,并将它们输入到通用类型阵列中 有谁知道最优雅的方法来实现这样的东西?

1 个答案:

答案 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()实例。

除了产品类别之外,您基本上对工厂进行了类型擦除。