3

我有几个带有索引属性的 Delphi Prism 类,我在 C# Web 应用程序中经常使用它们(我们正在将大型 Delphi Win32 系统迁移到 ASP.Net)。我的问题是,如果索引属性不是其类的默认属性,C# 似乎看不到它们。也许我做错了什么,但我完全迷失了。

我知道这个问题看起来很像错误报告,但在我报告错误之前,我需要知道其他人是否知道如何解决这个问题。

如果我有这样的课程:

TMyClass = public class
private
  ...
  method get_IndexedBool(index: Integer): boolean;
  method set_IndexedBool(index: Integer; value: boolean);
public
  property IndexedBool[index: Integer]: boolean
        read get_IndexedBool
        write set_IndexedBool; default; // make IndexedBool the default property
end;

我可以像这样在 C# 中使用这个类:

var myObj = new TMyClass();

myObj[0] = true;

但是,如果 TMyClass 是这样定义的:

TMyClass = public class
private
  ...
  method get_IndexedBool(index: Integer): boolean;
  method set_IndexedBool(index: Integer; value: boolean);
public
  property IndexedBool[index: Integer]: boolean
        read get_IndexedBool
        write set_IndexedBool; // IndexedBool is not the default property anymore
end;

然后 IndexedBool 属性在 C# 中变得不可见。我可以使用它的唯一方法是这样做:

var myObj = new TMyClass();

myObj.set_IndexedBool(0, true);

我不知道我是否遗漏了什么,但如果我删除属性声明中的默认值,我将看不到 IndexedBool 属性。除此之外,我很确定直接访问类实例的私有方法是错误的。

有任何想法吗?

4

3 回答 3

1

我相信C# 4.0 将支持索引属性,但遗憾的是,在此之前的任何内容都不会。

不幸的是,您要求的是 C# 而不是 Delphi Prism 的限制。来自Delphi Prism 与 C#的 Delphi Prism 文档 wiki 页面:

C# 只能访问默认的索引属性。在 Delphi Prism 中,您可以使用名称定义和使用其他索引属性。

此页面还概述了 Delphi Prism 代码包含 C# 上的独特或扩展功能的其他领域,这些功能可能对您的移植有用。

于 2010-03-19T08:32:39.503 回答
0

不幸的是,这是 C# 让您访问索引属性的唯一方式。这是一个 C# 编译器限制(vb.net 应该可以做到)。

于 2010-03-19T07:12:28.260 回答
0

不漂亮也不干净,但作为一种快速的解决方法,您可以公开索引属性访问器。这样您就可以在 C# 中使用它们来访问这些值。

于 2010-03-24T07:44:27.490 回答