views:

154

answers:

3

I have several Delphi Prism classes with indexed properties that I use a lot on my C# web applications (we are migrating a big Delphi Win32 system to ASP.Net). My problem is that it seems that C# can't see the indexed properties if they aren't the default properties of their classes. Maybe I'm doing something wrong, but I'm completely lost.

I know that this question looks a lot like a bug report, but I need to know if someone else knows how to solve this before I report a bug.

If I have a class like this:

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;

I can use this class in C# like this:

var myObj = new TMyClass();

myObj[0] = true;

However, if TMyClass is defined like this:

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;

Then the IndexedBool property becomes invisible in C#. The only way I can use it is doing this:

var myObj = new TMyClass();

myObj.set_IndexedBool(0, true);

I don't know if I'm missing something, but I can't see the IndexedBool property if I remove the default in the property declaration. Besides that, I'm pretty sure that it is wrong to have direct access to a private method of a class instance.

Any ideas?

A: 

It's unfortunate but that's the only way C# lets you access index properties. It's a C# compiler limitation (vb.net should do it fine).

Ck
+1  A: 

I believe that C# 4.0 will support indexed properties but that anything before that will sadly not.

Unfortunately, what you are asking for is a limitation of C# and Not Delphi Prism. From the Delphi Prism Documentation wiki page on Delphi Prism vs C#:

C# can only access the default indexed properties. In Delphi Prism, you can define and use other indexed properties using their name.

This page also outlines other areas where Delphi Prism code includes unique or extended features over C# which might be useful in your port.

jamiei
Yes, I use that to implement indexed properties on some C# classes that are used on my applications, but the problem is with my Delphi Prism classes. I thought that it was a Delphi Prism limitation, but as it works on VB then I think C# is the one to blame.
Arcturus
Yes, It is C# limitation rather than a Delphi Prism limitation. You're having to hack around the C# support rather than the Prism support.
jamiei
Updated my answer to reflect.
jamiei
I should have looked at the wiki page before asking here. Thank you for your answer.
Arcturus
A: 

Not beautiful or clean, but as a fast workaround you could make the indexed property accessors public. That way you can use them from C# to access the values.

Sebastian P.R. Gingter