Difficulties grasping generics + IronRuby - any idea? (OpenXML)

Hi,

I’m testing out the OpenXML SDK with IronRuby (0.9.2). Turns out it’s
full
of generics in there, a good play field.

Here I’m trying to use the API to retrieve a list of sheets in an
existing
xslx.

I’m having a hard-time understanding why I can’t call “b.first” in the
next
snippet (full version at generics-ironruby.rb · GitHub):

doc = SpreadsheetDocument.open(‘docs/single-cell.xlsx’, false)

a = doc.workbook_part.workbook.method(:get_first_child).of(Sheets).call
puts a

→ DocumentFormat.OpenXml.Spreadsheet.Sheets

b = a.method(:elements).of(Sheet).call
puts b

DocumentFormat.OpenXml.OpenXmlElementList+d__0`1[DocumentFormat.OpenXml.Spreadsheet.Sheet]

b.first or anything similar fails

It turns out that b.methods shows a “to_a” method is available, then I
can
do :

puts b.to_a.first # woot!

→ DocumentFormat.OpenXml.Spreadsheet.Sheet

So my questions are:

  • why can’t I call b.first ? (maybe there’s something obvious I didn’t
    see -
    I assume it’s probably that)
  • are there better ways of writing this ?

And if you are interested to follow (I really need to wrap some ruby
sugar
around all this to make it easier to work with), I’ll push my
experiments
here:

thanks,

Thibaut

You can’t call a C# extension method off of the object. You might try
creating a mixin to add a method_missing to catch and call the
appropriate
extensions. Otherwise, I think you have to call them as static members,
e.g.
Enumerable.First.Of(Sheet).call(b). That looks horrifying, I know. I
don’t
have IR available on this machine, or I would try it myself. Let me know
how
that goes. This seems like it will be a fairly common problem for things
like LINQ, PFx and Rx. Maybe we can come up with a simple,
one-size-fits-all
solution?

Ryan R.

Email: [email protected]
LinkedIn: http://www.linkedin.com/in/ryanriley
Blog: http://wizardsofsmart.net/
Website: http://panesofglass.org/

On Fri, Nov 20, 2009 at 9:17 AM, Thibaut Barrère

Hi Ryan,

You can’t call a C# extension method off of the object. You might try

creating a mixin to add a method_missing to catch and call the appropriate
extensions. Otherwise, I think you have to call them as static members, e.g.
Enumerable.First.Of(Sheet).call(b). That looks horrifying, I know. I don’t
have IR available on this machine, or I would try it myself. Let me know how
that goes. This seems like it will be a fairly common problem for things
like LINQ, PFx and Rx. Maybe we can come up with a simple, one-size-fits-all
solution?

yikes :slight_smile: I was pretty sure something like that was involved.

I think I’ll try the static version first, see if it works.

thanks for the hint, I’ll keep you posted :slight_smile:

– Thibaut