Vec*_*tor 10 .net c# delphi oop factory
我知道之前已经问过这个问题,但我还没有看到一个简短明了的答案,所以我希望他们不会删除这个问题,现在我会得到一个明确的答案:
我目前在C#5.0工作; .NET 4.5; VS 2012.虽然我已经做了大量的C#,但我主要是一名德尔福人.
在Delphi中,我已经编写了数百个使用以下设计的类工厂(这里很简单):
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.
Run Code Online (Sandbox Code Playgroud)
现在:我如何在C#中做这样的事情?!似乎C#中没有 '类'类型.我错过了什么吗?如何在C#中简单而优雅地实现这种类型的工厂?这个设计也可以在Python中实现 - 为什么C#会更糟??
你可以使用Type:
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(....);
}
Run Code Online (Sandbox Code Playgroud)
但我认为你应该使用通用方法:
public T Factory<T>(): where T is MyBaseClass
{
var type = typeof(T);
var constructor = type.GetConstructor(....);
return constructor.Invoke(....) as T;
}
Run Code Online (Sandbox Code Playgroud)
以下是参数化构造的多种选择:
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;
}
Run Code Online (Sandbox Code Playgroud)
而且当然; 与第一个示例一样,如果找不到匹配的构造函数,这将抛出nullpointerexception ...
| 归档时间: |
|
| 查看次数: |
1463 次 |
| 最近记录: |