Every once and awhile I find the need to get a reference to a Type maintained in a separate assembly. This tends to happen when I am loading assemblies at runtime and am trying to build an instance of a known Type in that assembly. In fact, this is how my XmlProvider class builds instances. Well I have found that the built in System.Reflection.Emit.TypeBuilder.GetType(…) method does not deal well with these advanced situations. So here is a very inefficient, brute force method for getting the Type object you need. Also note that I have included some tags for cross-platform compatibility. I am still looking for a workaround for the Zune and Xbox 360.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| /// <summary>
/// Handles cross assembly type referencing by searching loaded assemblies for a type.
/// </summary>
public static class TypeBuilder
{
public static Type[] GetBaseTypes(Type type)
{
List<Type> types = new List<Type>();
Type t = type;
while (t.BaseType != null)
{
if (t.BaseType == typeof(Object))
break;
types.Add(t.BaseType);
t = t.BaseType;
}
return types.ToArray();
}
/// <summary>
/// Gets the Type object for a specific type name.
/// </summary>
/// <param name="typeName">The type name to search.</param>
/// <returns>A Type object.</returns>
/// <remarks>Searches assemblies only loaded in the current application domain.</remarks>
/// <seealso cref="System.Reflection.Emit.TypeBuilder"/>
public static Type GetType(string typeName)
{
#if ZUNE
return null;
#else
if (String.IsNullOrEmpty(typeName))
throw new ArgumentException("Provided type name was invalid.");
// Get a list of assemblies first...
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
// Loop through until we find the type.
foreach (Assembly assembly in assemblies)
{
Type t = assembly.GetType(typeName);
if (t == null)
{
Type[] ts = assembly.GetTypes();
foreach (Type type in ts)
if (type.Name == typeName || type.AssemblyQualifiedName == typeName)
return type;
}
if (t != null)
return t;
}
// We may need to fall back on the built in builder.
return System.Reflection.Emit.TypeBuilder.GetType(typeName);
#endif
}
} |