2010-05-26 23 views
5

Tôi hiện đang tạo trình bao bọc xà phòng cho một số hàm Delphi để chúng tôi có thể dễ dàng sử dụng chúng từ PHP, C# và Delphi.Cách hiển thị loại bộ Delphi qua Soap

Tôi tự hỏi cách tốt nhất để hiển thị các bộ là gì.

type 
    TCountry  = (countryUnknown,countryNL,countryD,countryB,countryS,countryFIN,countryF,countryE,countryP,countryPl,countryL); 
    TCountrySet = set of TCountry; 

function GetValidCountrySet(const LicensePlate:string; const PossibleCountriesSet:TCountrySet):TCountrySet; 

tôi đang quấn nó như thế này cho máy chủ xà phòng:

type 
    TCountryArray = array of TCountry; 

function TVehicleInfo.GetValidCountrySet(const LicensePlate:string; const PossibleCountriesSet:TCountryArray):TCountryArray; 

Nó hoạt động, nhưng tôi cần phải viết rất nhiều mã vô dụng và xấu xí để chuyển đổi bộ -> mảng và mảng -> bộ.

Có cách nào dễ dàng hơn, thanh lịch hơn hoặc chung chung hơn để thực hiện việc này không?

Trả lời

2

Bạn có thể sử dụng TypInfo và sử dụng một chút đúc thông minh.

uses TypInfo; 

type 
    TCountry = (cnyNone, cnyNL, cnyD, cnyGB, cnyF, cnyI); 
    TCountrySet = set of TCountry; 

    TCountryArray = array of TCountry; 
    TEnumIntegerArray = array of Integer; 
    TEnumByteArray = array of Byte; 

function GetEnumNamesInSet(const aTypeInfo: PTypeInfo; const aValue: Integer; const aSeparator: string = ','): string; 
var 
    IntSet: TIntegerSet; 
    i: Integer; 
begin 
    Result := ''; 
    Integer(IntSet) := aValue; 
    for i := 0 to SizeOf(Integer) * 8 - 1 do begin 
    if i in IntSet then begin 
     if Result <> '' then begin 
     Result := Result + ','; 
     end; 
     Result := Result + GetEnumName(aTypeInfo, i); 
    end; 
    end; 
end; 

function SetToIntegerArray(const aTypeInfo: PTypeInfo; const aValue: Integer): TEnumIntegerArray; 
var 
    IntSet: TIntegerSet; 
    i: Integer; 
begin 
    SetLength(Result, 0); 
    Integer(IntSet) := aValue; 
    for i := 0 to SizeOf(Integer) * 8 - 1 do begin 
    if i in IntSet then begin 
     SetLength(Result, Length(Result) + 1); 
     Result[Length(Result) - 1] := i; 
    end; 
    end; 
end; 

function SetToByteArray(const aTypeInfo: PTypeInfo; const aValue: Byte): TEnumByteArray; 
var 
    IntSet: TIntegerSet; 
    i: Integer; 
begin 
    SetLength(Result, 0); 
    Integer(IntSet) := aValue; 
    for i := 0 to SizeOf(Byte) * 8 - 1 do begin 
    if i in IntSet then begin 
     SetLength(Result, Length(Result) + 1); 
     Result[Length(Result) - 1] := i; 
    end; 
    end; 
end; 

Sau đó sử dụng như:

procedure TEnumForm.FillMemo; 
var 
    Countries: TCountrySet; 
// EIA: TEnumIntegerArray; 
    EBA: TEnumByteArray; 
    CA: TCountryArray; 
    i: Integer; 
    cny: TCountry; 
begin 
    Countries := [cnyNL, cnyD]; 
    CountriesMemo.Text := GetEnumNamesInSet(TypeInfo(TCountry), Byte(Countries)); 
// if SizeOf(TCountry) > SizeOf(Byte) then begin 
// EIA := SetToIntegerArray(TypeInfo(TCountry), Integer(Countries)); 
// end else begin 
    EBA := SetToByteArray(TypeInfo(TCountry), Byte(Countries)); 
// end; 
    CountriesMemo.Lines.Add('===='); 
    CountriesMemo.Lines.Add('Values in Array: '); 
// if SizeOf(TCountry) > SizeOf(Byte) then begin 
// CA := TCountryArray(EIA); 
// end else begin 
    CA := TCountryArray(EBA); 
// end; 
    for i := 0 to Length(CA) - 1 do begin 
    CountriesMemo.Lines.Add(IntToStr(Ord(CA[i]))); 
    end; 
    CountriesMemo.Lines.Add('===='); 
    CountriesMemo.Lines.Add('Names in Array: '); 
// if SizeOf(TCountry) > SizeOf(Byte) then begin 
// CA := TCountryArray(EIA); 
// end else begin 
    CA := TCountryArray(EBA); 
// end; 
    for i := 0 to Length(CA) - 1 do begin 
    cny := CA[i]; 
    CountriesMemo.Lines.Add(GetEnumName(TypeInfo(TCountry), Ord(cny))); 
    end; 
end; 

Bạn sẽ cần phải chọn đúc thích hợp dựa trên kích thước của enum TCountry. Nếu nó có 8 thành viên, nó sẽ là một Byte, lớn hơn và nó sẽ là một Integer. Dù sao, Delphi sẽ khiếu nại trên các diễn viên của Byte (Quốc gia) hoặc Integer (Quốc gia) khi bạn nhận được nó sai.

Xin lưu ý: Các chức năng giờ đây lấy TypeInfo of TCountry - các thành phần của TCountrySet. Họ có thể được thay đổi để có TypeInfo (TCountrySet). Tuy nhiên điều đó có nghĩa là có các chức năng làm việc ra những yếu tố trong bộ này và tôi chỉ đơn giản là không có thời gian hoặc độ nghiêng để làm điều đó được nêu ra.

1

Xà phòng nên được sử dụng theo cách không thuyết phục về nền tảng và ngôn ngữ - Tôi sẽ thiết kế tất cả các đối tượng chuyển dữ liệu (DTO) dựa trên các loại đơn giản, ví dụ: array of string, không có các tính năng cụ thể về ngôn ngữ. Sau đó ánh xạ DTO đến các đối tượng kinh doanh phù hợp. Điều này cũng sẽ cung cấp cho bạn một 'lớp anticorruption'.

Các vấn đề liên quan