将c#转换为delphi



我需要帮助移植这个c#代码到Delphi,我试过了,但德尔福的问题是TArray是一个泛型类型看看我的delphi代码procedure WriteVector(array: TArray);

internal static void WriteValue(object value, Type valueType)
{
var type = value.GetType();
switch (Type.GetTypeCode(type))
{   
// the following are already implemented into delphi
case TypeCode.Int32: Write((int)value); break;
case TypeCode.Int64: Write((long)value); break;
case TypeCode.UInt32:Write((uint)value); break;
case TypeCode.UInt64:Write((ulong)value); break;
case TypeCode.Double:Write((double)value); break;
case TypeCode.Object:
if (type.IsArray)   
// the issue is here            
WriteVector((Array)value);
break;
default:
break;
}
}


internal static void WriteVector(Array array)
{
if (array == null) { return; }
int count = array.Length;
// save count value
var elementType = array.GetType().GetElementType();
for (int i = 0; i < count; i++)
WriteValue(array.GetValue(i), elementType);
}   
// My delphi code  
procedure WriteValue(Value: TValue; valueType: PTypeInfo);
begin
case Value.Kind of
tkArray:
WriteVector(Value.AsType<TArray>);
end;
end;


procedure WriteVector(array: TArray);
var
count: Integer;
i: Integer;
begin
if array = nil then
begin
Exit;
end;
// count := Length(array);
// save count value
// how the rest can be correctly written ?
end;

抱歉,我在发帖前没有更新页面。我就不动了。

嗯…我看到一些循环/递归的东西,WriteValue调用WriteVector,WriteVector调用WriteValue,就是这样。没有使用valueType参数,非数组值将被忽略。如果没有额外的细节,就很难提出好的解决方案。作为一个选项,您可以使用Variant类型。

procedure WriteValue(vValue: Variant);
begin
if ( VarIsArray(vValue) ) then begin
WriteVector(vValue);
end
else if ( VarIsStr(vValue) ) then
begin
end
else if ( VarIsType(vValue, [varShortInt, varDate]) ) then
begin
end
else begin
case VarType(vValue) of
varByte: begin
end;
varDouble: begin
end;
else
// default
end;
end;
end;
procedure WriteVector(vArray: Variant);
var
i: Integer;
begin
if ( not VarIsArray(vArray) ) then Exit;
if ( VarArrayDimCount(vArray) <> 1 ) then Exit;
for i := VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do
WriteValue( VarArrayGet(vArray, [i]) );
end;
procedure Test();
var
v: variant;
begin
v := VarArrayOf( ['0', Now(), Byte(1), Double(2), VarArrayOf([3, 4, 5])] );
WriteValue(v);
WriteVector(Null);
end;

最新更新