Il existe en fait un moyen très simple de faire cela dans C# 4.0 .. dunno quel framework vous utilisez .
Cela devrait vous donner une longueur d'avance .. mais rappelez-vous que vous devez déclarer un peu plus juste pour sécuriser votre code.
class DynamicTester : DynamicObject
{
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
Console.WriteLine("Someone is calling method {0}", binder.Name); result = null; return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
Console.WriteLine("Someone is trying to get attribute {0}", binder.Name); result = null; return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
Console.WriteLine("Someone is trying to set attribute {0} to value {1}", binder.Name, Convert.ToString(value)); return true;
}
}
class Program
{
static void Main(string[] args)
{
dynamic dt = new DynamicTester();
dt.A = "Test"; dt.B = 14; dt.date = DateTime.Now;
var i = dt.Z;
dt.Tester(1, 2, 3);
}
}
L'élément clé est d'utiliser dynamic comme type de données. Cela le marquera de ne pas essayer de résoudre les appels de méthodes/attributs au moment de la compilation, mais à l'exécution, même avec votre propre code.
simplifie énormément tout le refactoring qui devait être fait auparavant.
vous pouvez faire exactement cela avec des objets dynamiques dans C# 4, sans utiliser de réflexion même. –