【问题标题】:Cast of a C# object to string in delphi在delphi中将C#对象转换为字符串
【发布时间】:2016-12-29 00:05:03
【问题描述】:

我正在将一个 c# 项目转换为 delphi XE5,但我被困在一个(我相信)简单的任务上。

public void TransferFile(object o, Stream stream)
{
    string s = o as string;
    if (s != null)
    { do something }
    else { do something else }
}

其中 o 包含一个对象的句柄(在这种情况下,它的值为 689520929)并且转换为字符串报告 null,这是预期的结果。

我用delphi翻译了如下:

procedure TransferFile(o: OleVariant; stream: TFileStream);
var
  s: string;
begin
  s:= IntToStr(o);
  if (s <> '') then do something
  else do something else
end;

在这种情况下,将变体转换为字符串会报告数字表示 (689520929),这会导致程序流产生不同的行为。

帮助表示赞赏:)

【问题讨论】:

  • 使用VarType 检测变量中保存的类型
  • 是的,这没有多大意义。 C# 代码中没有整数到字符串的转换,因此 Delphi 代码中不应该有整数到字符串的转换。但是很难说首先将object 转换为OleVariant 是否是最好的方法,因为没有迹象表明谁调用了该过程,允许哪些类型,以及该过程对它还有什么作用。
  • 使用 TFileStream 也很奇怪。为什么要限制自己的文件?这样做没有任何好处。但是没有任何背景,很难给你好的建议。代码永远不会完全孤立地翻译。
  • Olevariant 是我实际得到的对象数据类型的最佳表示。
  • Olevariant 实际上是我在 delphi 中获得的对象数据类型的最佳表示。顺便说一句,Vartype 总是会带来存储在变体中的数字表示,因此字符串总是不同于 ''

标签: c# delphi object types casting


【解决方案1】:

使用VarIsStr() 检查(Ole)Variant 是否包含字符串值,例如:

procedure TransferFile(o: OleVariant; stream: TFileStream);
var
  s: string;
begin
  if VarIsStr(o) then begin
    s := VarToStr(o);
    // do something...
  end else begin
    // do something else...
  end;
end;

【讨论】:

  • Marco,VarIsStr 建立在您声称不合适的 VarType 之上。让我相信您对变体没有很好的理解,最好复习一下。
猜你喜欢
  • 2016-01-06
  • 2022-01-01
  • 2011-09-30
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多