I recently implemented a ValueConverter for our comboboxes in silverlight, whereby the translations for an enum would be shown as a list in the combobox, and when an item is selected, the value bound to the model would be whatever was described on the enumeration as the model value that gets persisted to the database (it’s a legacy database, so I couldn’t save the enumerated value on the model). Anyways, more on how that was done is for another blog post.
The converter gets an enumeration type as a converter parameter, so I needed to construct the type of enum at runtime (so I could get access the the enumerations that were defined, and the ModelValue attributes on each enumeration definition), since the converter should be able to handle any enumeration type that has been defined according to a specific convention. Trouble is, the enumerations were defined in a seperate silverlight assembly that was referenced from the client assembly, so I couldn’t just simply:
1: Type type = Type.GetType("ClassLibrary1.Class1, ClassLibrary1");
… only if you specify the culture and the version in the above string parameter, will the type get returned, and since those change frequently, it wasn’t a practical solution.
So here’s helper method I wrote to get a type referenced in another assembly:
1: public static Type GetAssemblyType(string assemblyName, string className)
2: {
3: StreamResourceInfo info = Application.GetResourceStream(new Uri(assemblyName, UriKind.Relative));
4: Assembly assembly = new AssemblyPart().Load(info.Stream);
5: Type type = assembly.GetType(className);
6:
7: return type;
8: }
Usage:
… if you know the fully qualified class name and which assembly it’s in:
1: Type type = GetAssemblyType("SilverlightClassLibrary1.dll", "SilverlightClassLibrary1.Class1");
… or if you only know the fully qualified class name, and don’t know which assembly it’s in:
1: public static Type GetAssemblyType(string className)
2: {
3: Type type = null;
4: foreach (AssemblyPart part in Deployment.Current.Parts)
5: {
6: type = GetAssemblyType(part.Source, className);
7: if (type != null)
8: break;
9: }
10: return type;
11: }
usage:
1: Type type = GetAssemblyType("SilverlightClassLibrary1.Class1");
Notice that in each case that the class name that is specified is fully qualified with it’s namespace.
Happy Coding :)