[Mono-dev] gmcs and The Future

Jonathan Pryor jonpryor at vt.edu
Wed Feb 4 09:18:13 EST 2009

On Wed, 2009-02-04 at 22:56 +1300, Scott Peterson wrote:
> I will start the ball rolling with a simple feature:
> Problem: While the 'typeof' keyword is very convenient for getting
> Type objects, it is much more difficult to get any other kind of
> reflection data. For example, to get a MethodInfo object, one usually
> does:
> > static readonly MethodInfo methodInfo = typeof(Foo).GetMethod("Bar", new Type [] { typeof(string), typeof(int) });

This can already be improved upon:

	MethodInfo methodInfo = 
		new Func<string, int, RetType>(Foo.Bar).Method;
		// or Action<string, int> depending on return type

Ideally, this could be improved upon *further*:

	MethodInfo methodInfo = Lambda.F(Foo.Bar).Method;

Lambda comes from Mono.Rocks, and has methods such as:

	static class Lambda {
	  public static Func<T1, T2, TResult> F<T1, T2, TResult> (
	      Func<T1, T2, TResult> lambda)
	    return lambda;

Alas, this doesn't work for two reasons:

1. Foo.Bar() could be overloaded, and the above Lambda.F() doesn't allow
   specifying the overload.  This can be "fixed" by explicitly 
   specifying parameters:

	MethodInfo mi = Lambda.F<string, int, RetType>(Foo.Bar);
	// or MethodInfo m = Lambda.A<string, int>(Foo.Bar);

2. C#'s type inferencing *sucks*.  It's nice, but compared to e.g. F# 
   it's *very* limited.  For example:

	var f = Lambda.F(Console.ReadLine);

There is only one Console.ReadLine() method, so you'd *hope* that C#
could infer the return type of Console.ReadLine and thus call
Lambda.F<TResult>(Func<TResult>), as it's the only possible match.
Alas, gmcs can't make this inference.

So interesting as `reflect' is, it would be ~easily handled with normal
libraries IF ONLY C#'s type inferencing didn't suck balls.

(The downside to the above is that it only works for methods, not
properties, events, or constructors, so `reflect' could still be useful,
though it would be nice if a new keyword wasn't needed.)

 - Jon

More information about the Mono-devel-list mailing list