我知道这个问题已经被问过了,但是我还没有看到一个简短明了的答案,所以我希望他们不会删除这个问题,我现在得到一个明确的答案:
我目前在C#5.0中工作; .NET 4.5; VS.我主要是一个Delphi的家伙,虽然我已经做了很多C#.
在德尔福我已经写了数百个类工厂,使用以下类型的设计(这里很简单):
unit uFactory; interface type TClassofMyClass = class of TMyClass; TFactoryDict = TDictionary<TMyEnum,TClassofMyClass>; var fDict:TFactoryDict; implementation procedure initDict; begin fDict:=TFactoryDict.create; fDict.add(myEnum1,TMyClass1); fDict.add(myEnum2,TMyClass2); fDict.add(myEnum3,TMyClass3); end; function Factory(const aEnum: TMyEnum): TMyClass; var ClassofMyClass: TClassofMyClass; begin if fDict.TryGetValue(aEnum,ClassofMyClass) then result := ClassofMyClass.Create(aParam); end; end.
现在:C#中怎么做这样的事情?似乎在C#中没有’类’.我错过了什么吗?如何在C#中简单而优雅地实现这类类工厂?这个设计可以在Python中实现 – 为什么C#会更糟糕?
解决方法
您可以使用类型:
Dictionary<ClassEnum,Type> TypeDictionary = new Dictionary<ClassEnum,Type>(); public void InitDictionary() { TypeDictionary.Add(ClassEnum.FirstClass,typeof(FirstClass)); //etc... } public object Factory(ClassEnum type) { if (!TypeDictionary.ContainsKey(type)) return null; var constructor = TypeDictionary[type].GetConstructor(....); return constructor.Invoke(....); }
但我认为你应该使用一个通用的方法:
public T Factory<T>(): where T is MyBaseClass { var type = typeof(T); var constructor = type.GetConstructor(....); return constructor.Invoke(....) as T; }
以下是参数化结构的各种参数:
public T Factory<T>(params object[] args): where T is MyBaseClass { var argList = new List<object>(args); var type = typeof(T); var argtypes = argList.Select(o => o.GetType()).ToArray(); var constructor = type.GetConstructor(argtypes); return constructor.Invoke(args) as T; }
而且当然;与第一个例子一样,如果找不到匹配的构造函数,这将抛出一个nullpointerexception …