加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi类的C#

发布时间:2020-12-15 04:25:29 所属栏目:大数据 来源:网络整理
导读:我知道这个问题已经被问过了,但是我还没有看到一个简短明了的答案,所以我希望他们不会删除这个问题,我现在得到一个明确的答案: 我目前在C#5.0中工作; .NET 4.5; VS.我主要是一个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 …

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读