Skip to Content

Reflection

Is the ability to inspect and change information about assemblies, types and code at runtime. Is used for plugin development, logging, code analysis etc. Assemblies contain modules => Modules contain types => Types contain code

var a = Assembly.LoadFrom("MyAssembly.dll"); var b = Assembly.GetExecutingAssembly(); // List all types in assembly Type[] types = a.GetTypes(); foreach (var t in types) Console.WriteLine(t.FullName); Type t = assembly.GetType("Namespace.SomeClass"); foreach (MethodInfo m in t.GetMethods()) Console.WriteLine(m.Name); object o = a.CreateInstance("MyPlugin.HelloWorld"); Type hwClass = a.GetType("MyPlugin.MethodInfo"); MethodInfo mi = hwClass.GetMethod("ToString"); // by default only public MethodInfo mi = hwClass.GetMethod("SayItPrivate", BindingFlags.Instance | BindingFlags.NonPublic); object retVal = mi.Invoke(o, null); // Does class implement interface? Type type = assembly.GetTypes () // scan all types .Where(t => t.IsClass) // it must by a class , that .Single(t => t.GetInterface("IMyInterface" != null ); // implements my interface IMyInterface myObj = assembly.CreateInstance(type.FullName) as IMyInterface; // call method double res = myObj.DoSomething("input", 20);
Reflection API in C#
Reflection API in C#

System.Type

Represents type declarations: class types, interface types, array and value types, enumeration types, type parameters, and more. Value, Interface or Class? => IsValueType , IsInterface , IsClass Public, Private or Sealed => IsNotPublic , IsSealed Abstract or Implementation? => IsAbstract

Attributes

[Serializable] class C {...} // marks the class as serializable // will force compiler to produce a message public class ObsoleteAttribute : Attribute { public string Message { get {...} public bool IsError { get {...} set {...} public ObsoleteAttribute() {...} public ObsoleteAttribute(string msg) {...} public ObsoleteAttribute(string msg , bool error) {...} } [Obsolete("Message Use class C1 instead", true)] public class C {.. } // Querying attributes at runtime Type t = typeof(C); object[] a = t.GetCustomAttributes(typeof(Comment), true); Comment ca = (Comment)a[0]; Console.WriteLine(ca.Text + ", " + ca.Author);

AttributeUsage

public class AttributeUsageAttribute : Attribute{ public AttributeUsageAttribute(AttributeTargets validOn){...} public bool AllowMultiple { get; set; } // default: false public bool Inherited { get; set; } // default: true public AttributeTargets ValidOn { get; set; } // default: All public virtual Object TypeId {get;} } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public class MyAttribute : Attribute {...}

validOn => to which program elements is the attribute applicable? AllowMultiple => can it be applied to the same program element multiple times? Inherited => is it inherited by subclasses? TypeID => when implemented, gets unique identifier for derived attribute classes

Last updated on