Use Reflection to call generic method on object instance with signature: SomeObject.SomeGenericInstanceMethod(T argument)?

You do it exactly the same way When you call MethodInfo. Invoke, you pass all the arguments in an object anyway, so it's not like you have to know the types at compile time Sample: using System; using System. Reflection; class Test { public static void Foo(T item) { Console.

WriteLine("{0}: {1}", typeof(T), item); } static void CallByReflection(string name, Type typeArg, object value) { // Just for simplicity, assume it's public etc MethodInfo method = typeof(Test). GetMethod(name); MethodInfo generic = method. MakeGenericMethod(typeArg); generic.

Invoke(null, new object { value }); } static void Main() { CallByReflection("Foo", typeof(object), "actually a string"); CallByReflection("Foo", typeof(string), "still a string"); // This would throw an exception // CallByReflection("Foo", typeof(int), "oops"); } }.

You do it exactly the same way. When you call MethodInfo. Invoke, you pass all the arguments in an object anyway, so it's not like you have to know the types at compile time.

Sample: using System; using System. Reflection; class Test { public static void Foo(T item) { Console. WriteLine("{0}: {1}", typeof(T), item); } static void CallByReflection(string name, Type typeArg, object value) { // Just for simplicity, assume it's public etc MethodInfo method = typeof(Test).

GetMethod(name); MethodInfo generic = method. MakeGenericMethod(typeArg); generic. Invoke(null, new object { value }); } static void Main() { CallByReflection("Foo", typeof(object), "actually a string"); CallByReflection("Foo", typeof(string), "still a string"); // This would throw an exception // CallByReflection("Foo", typeof(int), "oops"); } }.

– smartcaveman Jan 19 at 17:39 @smartcaveman: No, you'd need to work out which one to call. Calling GetMethod(string, Type) can get quite tricky when the parameter types are generic - I usually use GetMethods in conjunction with a LINQ query to find the right method. – Jon Skeet Jan 19 at 17:41 Something like: typeof(Test).

GetMethods(BindingFlags. Instance). Where(x=>x.

IsGenericMethodDefinit? Ion & x.Name==name)? – smartcaveman Jan 19 at 17:46 @smartcaveman: Well that wouldn't help if there were two generic methods with the same name.

Basically I can't help you much here, because I don't know how you want to be able to identify the right method. Work out how you'd tell them apart manually, and write a query for it. – Jon Skeet Jan 19 at 17:48 How do you determine that a ParameterInfo is generic?

– smartcaveman Jan 19 at 17:49.

You do it exactly the same way, but pass an instance of your object: typeof (SomeObject). GetMethod( "SomeGenericInstanceMethod", yourObject.GetType()) // Or typeof(TheClass), // or typeof(T) if you're in a generic method . MakeGenericMethod(typeof(GenericParameter)) The MakeGenericMethod method only requires you to specify the generic type parameters, not the method's arguments.

You'd pass the arguments in later, when you call the method. However, at this point, they're passing as object, so it again doesn't matter.

1 Note that the GetMethod call may fail if yourObject is a subtype of the required one, as in my first example. The subtype may not satisfy the constraints - for example, consider Foo(T item) where T : new() called as Foo("hello"). We don't want to call Foo("hello") as string doesn't have a parameterless constructor.

– Jon Skeet Jan 19 at 17:44 @Jon: Very true. – Reed Copsey Jan 19 at 17:46.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions