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.
Not really. You need to use reflection, basically. Generics are really aimed at static typing rather than types only known at execution time.
MethodInfo method = typeof(Foo). GetMethod("MyGenericMethod"); method = method. MakeGenericMethod(t); method. Invoke(this, new object[0]);
Yes, you can define a generic method in a non-generic class in Java.
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With