На самом деле в C # 4.0 существует действительно простой способ сделать это ... не знаю, какую платформу вы используете.
Это даст вам уверенность в себе ... но помните, что вам нужно объявить немного больше, чтобы сделать ваш код безопасным.
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);
}
}
Ключевым моментом является использование динамического типа данных. Это будет означать, что он не будет пытаться разрешать вызовы методов / атрибутов во время компиляции, но во время выполнения даже с вашим собственным кодом.
значительно упрощает весь рефакторинг, который должен был быть сделан ранее.