(sort of) First Class Classes in C#

2010-08-10 c / functional-programming
It seems, at first, that C# doesn't have first-class classes. But ...

I find myself writing some C# code while still thinking in Python. One thing in particular caught me out … it seems, at first, that C# doesn’t have first class classes. This is annoying, because I’d started writing some device driver classes where each class is a type of device, and instances represent the individual devices themselves. And I wanted to construct a list of these classes, and call a “probe” classmethod on each of them to ask the class to go search out any devices which were available. In Python, this would look something like:

device_classes = (FooDevice, BarDevice, BazDevice)

for device_class in device_classes:

See? The classes are being treated just like any other variable, because they are, they’re just instances of type classobj. But the equivalent doesn’t work in C# — doing this:

Type[] DeviceClasses = {

… complains that ‘FooDevice’ is a ‘type’ but is used like a ‘variable’. At first it seemed that C# didn’t have first class classes, and indeed a few web searches came up empty handed.

Thankfully after a bit more exploration it turns out that all that is needed is some syntactic nastiness … namely, typeof(), GetMethod() and Invoke() (Passing null to Invoke() works for static methods):

Type[] DeviceClasses = {

foreach (Type dct in DeviceClasses) {
    dct.GetMethod("Probe").Invoke(null, new object[] {} );

Now, quite why a shiny new programming language has to get saddled with such godawful syntax is a bit beyond me, but so it goes.

As always, this is lovingly documented in MSDN, in such a way that the answer is clear so long as you already know what you’re looking for.

(As a bonus, yes, you can use reflection to find the list of Devices in the first place. It just wasn’t all that relevant to this example)