Procedeul de reflection consta in interogarea metadatelor si a codului compilat, la runtime. Aceste informatii sunt folosite in dynamic binding, data binding, serializare, Remoting.
Folosind API-urile oferite de reflection se poate executa in mod dinamic cod dintr-un assembly oarecare. Presupunem ca avem un dll la care nu avem referinta si care contine o clasa pe care dorim sa o instantiem.
namespace Dynamic
{
public class Agent
{
public string Name { get; set; }
public Agent()
{
}
}
}
static void Main(string[] args)
{
string assemblyName = @"C:\Users\marius\Documents\Visual Studio 2010\Projects\Reflection\Dynamic\bin\Debug\Dynamic.dll";
Assembly assembly = Assembly.LoadFrom(assemblyName);
if (assembly != null)
{
Type type = assembly.GetType("Dynamic.Agent");
if (type != null)
{
dynamic agent = Activator.CreateInstance(type);
agent.Name = "Marius";
Console.WriteLine(agent.Name);
}
}
}
Am folosit tipul dynamic din C# 4.0 pentru a apela proprietatea obiectului agent, la runtime. Alte optiuni ar fi fost clasa MethodInfo si apelurile Invoke.
In comparatie cu dynamic binding, care este mai usor de folosit si care se bazeaza pe DLR pentru interoperabilitate, reflection pare mai dificil in utilizare, acesta fiind mai strans legat de CLR.