Recipe13.13.Determining if a Type or Method Is Generic


Recipe 13.13. Determining if a Type or Method Is Generic

Problem

You need to test a type and/or a method to determine whether it is generic.

Solution

Use 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); } 

Discussion

The 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 Also

See the "Type.HasGenericArguments Method" and "MethodInfo.HasGenericArguments Method" topics in the MSDN documentation.



C# Cookbook
Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Input Validation & More
ISBN: 0596003943
EAN: 2147483647
Year: 2004
Pages: 424

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net