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
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
you can make this type by
typeof(Foo<>).MakeGenericType(bar);
I prefer old-school polymorphism methods call and specified class structure.
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);
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!