tags:

views:

59

answers:

4

Hi SO,

I have a generic method

Foo<T>

I have a Type variable bar

Is it possible to achieve something like Foo<bar>

Visual studio is expecting a type or namespace at the bar.

Kindness,

Dan

+1  A: 

you can make this type by

typeof(Foo<>).MakeGenericType(bar);
Chen Kinnrot
A: 

I prefer old-school polymorphism methods call and specified class structure.

UGEEN
+3  A: 

Lets assume that Foo is declared in class Test such as

public class Test
{
   public void Foo<T>() { ... }

}

You need to first instantiate the method for type bar using MakeGenericMethod. And then invoke it using reflection.

var mi = typeof(Test).GetMethod("Foo");
var fooRef = mi.MakeGenericMethod(bar);
fooRef.Invoke(new Test(), null);
VinayC
Thanks kindly ... just what I needed!
Daniel Elliott
+3  A: 

If I understand your question correctly, you have, in essence, the following types defined:

public class Qaz
{
    public void Foo<T>(T item)
    {
        Console.WriteLine(typeof(T).Name);
    }
}

public class Bar { }

Now, given you have a variable bar defined as such:

var bar = typeof(Bar);

You then want to be able to call Foo<T>, replacing T with your instance variable bar.

Here's how:

// Get the generic method `Foo`
var fooMethod = typeof(Qaz).GetMethod("Foo");

// Make the non-generic method via the `MakeGenericMethod` reflection call.
// Yes - this is confusing Microsoft!!
var fooOfBarMethod = fooMethod.MakeGenericMethod(new[] { bar });

// Invoke the method just like a normal method.
fooOfBarMethod.Invoke(new Qaz(), new object[] { new Bar() });

Enjoy!

Enigmativity
+1 ... just a little later than accepted answer but wonderfully put!
Daniel Elliott
@`Daniel Elliot` - Yes, I know - 41 seconds later. I was hoping that my slightly more detailed answer would prevail, but alas. ;-)
Enigmativity