Как сделать индексированные свойства Delphi Prism видимыми для C #, если они не являются параметрами по умолчанию - PullRequest
3 голосов
/ 19 марта 2010

У меня есть несколько классов Delphi Prism с индексированными свойствами, которые я часто использую в своих веб-приложениях на C # (мы переносим большую систему 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, если я удаляю default в объявлении свойства. Кроме того, я уверен, что неправильно иметь прямой доступ к закрытому методу экземпляра класса.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 19 марта 2010

Я считаю, что C # 4.0 будет поддерживать индексированные свойства, но что до этого, к сожалению, не будет.

К сожалению, вы запрашиваете ограничение C #, а не Delphi Prism. Со страницы вики документации Delphi Prism на Delphi Prism vs C # :

C # может получить доступ только к индексированным свойствам по умолчанию. В Delphi Prism вы можете определять и использовать другие проиндексированные свойства, используя их имя.

На этой странице также описаны другие области, в которых код Delphi Prism включает уникальные или расширенные функции по сравнению с C #, которые могут быть полезны для вашего порта.

0 голосов
/ 24 марта 2010

Не красиво и не чисто, но в качестве быстрого обходного пути можно сделать общедоступными индексированные свойства доступа. Таким образом, вы можете использовать их из C # для доступа к значениям.

0 голосов
/ 19 марта 2010

К сожалению, это единственный способ, которым C # позволяет получить доступ к свойствам индекса. Это ограничение компилятора C # (vb.net должен делать это нормально).

...