I have a class like below:
class Foo
{
public Foo(int x) { ... }
}
and I need to pass to a certain method a delegate like this:
delegate Foo FooGenerator(int x);
Is it possible to pass the constructor directly as a FooGenerator
value, without having to type:
delegate(int x) { return new Foo(x); }
?
EDIT: For my personal use, the question refers to .NET 2.0, but hints/responses for 3.0+ are welcome as well.
Unfortunately not, constructors are not quite the same things as methods and as such you cannot create a delegate that points to them. This is an interesting idea though, perhaps with more information we could devise some sort of workaround that would be syntactically similar.
My guess is that it isn't possible since you would pass a method of an object that has not been created yet.
Nope, the CLR does not allow binding delegates to
ConstructorInfo
.You can however just create your own:
Usage
I'm assuming you would normally do something like this as part of a factory implementation, where the actual types aren't known at compile-time...
First, note that an easier approach may be a post-create init step, then you can use generics:
You can then use
MakeGenericMethod
and/orCreateDelegate
.Otherwise; you can do this with on the fly with
Expression
(3.5) orDynamicMethod
(2.0).The
Expression
approach is easier to code:or (using
DynamicMethod
):Marc Gravell's answer inspired me to the following very simple solution:
Almost the same thing if your constructor has params (in this example: 1 param of type int):
I think as concise as you're going to get (without moving to a factory pattern) would be something with anonymous methods, like this:
This isn't doing strictly what you asked for (since you're passing a delegate to an anonymous method that returns a new instance, rather than a direct delegate to the constructor), but I don't think what you're asking for is strictly possible.
This is, of course, assuming you're using 3.5+