Delphi类的C#

前端之家收集整理的这篇文章主要介绍了Delphi类的C#前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道这个问题已经被问过了,但是我还没有看到一个简短明了的答案,所以我希望他们不会删除这个问题,我现在得到一个明确的答案:

我目前在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 …

原文链接:https://www.f2er.com/delphi/101608.html

猜你在找的Delphi相关文章