Delphi类的C#

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#会更糟??

Sti*_*ård 9

你可以使用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 ...

  • @ORMapper:Delphi泛型构造函数约束也适用于无参数约束.只有在使用元类时,才能使用从TObject类层次结构中定义的更具体的构造函数到定义元类的类. (2认同)