Some commonly used uses for reflection…
Assemblies
First, you need to get a reference to an assembly.
Either by name:
AssemblyName assemblyRef=new AssemblyName("MyAssembly");
or by loading from a file:
AssemblyName assemblyRef=Assembly.LoadFrom("c:\stuff\myassembly.dll");
If your code is running in an assembly that is being called by another assembly, and you need the path to the parent assembly, you can do this:
string assemblyPath=new Uri(Assembly.GetEntryAssembly().GetName().CodeBase).LocalPath;
Assembly assemblyDll=Assembly.LoadFrom(assemblyPath);
Types
An assembly has types, and a list of those types can be retrieved by using the GetTypes() method
Type[] allTypes=assemblyRef.GetTypes();
Some of those types are not public and are used for internal purposes. You probably want to ignore those. The IsPublic property of a type will let you know if the type is public.
foreach(Type oneType in allTypes)
if (oneType.IsPublic)
Console.WriteLine(oneType.Name);
To get a type for inspection using the string equivalent of the type name, use the GetType() function:
(MyType)thisType=myAssembly.GetType("MyType",true);
Retrieving the namespace of a type
To retrieve the namespace of a type use the NameSpace property:
MyType.Namespace;
Creating an instance of a type
To create an instance of a type, use the Activator.CreateInstance method
(MyType)Activator.CreateInstance(thisType);
or
(MyType)Activator.CreateInstance("MyNamespaceName.MyTypeName");
To create an instance of a type using specific parameters in a constructor:
(MyType)Activator.CreateInstance(thisType,parameters); //parameters is an array of type object.
Here is another example:
(MyType)Activator.CreateInstance(thisType,
new Object[]
{
parm1,
parm2,
parm3
});
Constructors
A type can have constructors. Each constructor is an object of type of ConstructorInfo, and each ConstructorInfo object has a collection of ParameterInfo objects that describe each parameter of the constructor.
ConstructorInfo[] ctors=type.GetConstructors();
foreach(ConstructorInfo ctor in ctors)
foreach(ParameterInfo parmInfo in ctor.GetParameter())
Console.WriteLine(parmInfo.ParameterType.ToString())
Fields
A type has fields, which are the properties and constants associated with the type.
To retrieve a list of fields associated with a type, use the GetFields() function
FieldInfo[] fields=oneType.GetFields(
BindingFlags.Public
| BindingFlags.Static
| BindingFlags.FlattenHierachy);
Getting the value of a field
To get the value of a field, use the GetValue() function
object retVal=fields[0].GetValue(null);
Setting the value of a field
To set the value of a field, use the SetValue() function
myField.SetValue(myObjectInstance,myValue,null); //the NULL refers to the index of indexed properties.
Data type of fields
The TypeCode property of a field indicates what type it is, and can be retrieved using the GetTypeCode() function.
TypeCode thisFieldType=Type.GetTypeCode(myField)
TypeCode is an enumeration. Some of the TypeCode enumerations are:
TypeCode.Byte
TypeCode.Decimal
TypeCode.Double
TypeCode.Int16
TypeCode.Int32
TypeCode.Int64
TypeCode.SByte
TypeCode.Single
TypeCode.UInt16
TypeCode.UInt32
TypeCode.UInt64
TypeCode.Object
Attributes associated with fields
To retrieve field attributes use the GetCustomAttributes() function.
foreach(System.Attribute thisAttribute in thisType.GetCustomAttributes(true))
Console.WriteLine(thisAttribute.GetType().ToString());
To define a custom attribute, create a class that inherits from System.Attribute
[AttributeUsage(AttributeTargets.All)]
public class MyCustomType : System.Attribute
{
public MyCustomType()
{
}
}
Usage would then be as follows:
public class MyClass
{
[MyCustomType]
public string MyProperty{get;set;}
}