Recipe 13.13. Determining if a Type or Method Is GenericProblemYou need to test a type and/or a method to determine whether it is generic. SolutionUse the IsGenericType method of the Type class and the IsGenericMethod method of the MethodInfo class: public static bool IsGenericType(Type type) { return (type.IsGenericType); } public static bool IsGenericMethod(MethodInfo mi) { return (mi.IsGenericMethod); } DiscussionThe IsGenericType method examines objects and the IsGenericMethod method examines methods. These methods will return a true indicating that this object or method accepts type arguments and false indicating that it does not. One or more type arguments indicate that this type is a generic type. To call these methods, use code like the following: Assembly asm = Assembly.GetExecutingAssembly(); // Get the type. Type t = typeof(CSharpRecipes.DataStructsAndAlgorithms.PriorityQueue<int>); bool genericType = IsGenericType(t); bool genericMethod = false; foreach (MethodInfo mi in t.GetMethods()) genericMethod = IsGenericMethod(mi); This code first obtains an Assembly object for the currently executing assembly. Next, the Type object is obtained using the typeof method. For this method call, you pass in a fully qualified name of an object to this method. In this case you pass in CSharpRecipes.DataStructsAndAlgorithms.PriorityQueue<int>. Notice at the end is the string <int>. This indicates that this type is a generic type with a single type parameter of type int. In other words, this type is defined as follows: public class PriorityQueue<T> {…} If this type were defined with two type parameters, it would look like this: public class PriorityQueue<T, U> {…} and its fully qualified name would be CSharpRecipes.DataStructsAndAlgorithms. PriorityQueue<int, int>. This Type object tt is then passed into the IsGenericType method and the return value is true indicating that this type is indeed generic. Next, you collect all the MethodInfo objects for this type t using the GetMethods method of the Type t object. Each MethodInfo object is passed into the IsGenericMethod method to determine if it is generic or not. See AlsoSee the "Type.HasGenericArguments Method" and "MethodInfo.HasGenericArguments Method" topics in the MSDN documentation. |