2010-04-20 7 views
0

Disons que j'appelle la méthode M1 sur la classe A en utilisant la réflexion. La méthode n'existe pas..Net Reflection - Appeler des méthodes non existantes

Y at-il un moyen de mettre un gestionnaire sur la classe A qui dit, "quelqu'un essaie d'exécuter la méthode M1"?

Ou

Est-il possible d'ajouter une méthode dynamique à une classe? Je veux ajouter une méthode M1 ... Mn qui fait toujours MyStaticClass.DoAction ("M1 ... Mn");

Quelque chose comme:

chaîne methodName = "M1".

A.AddMethod (nom_méthode, x => MyStaticClass.DoAction (x));

+0

vous pouvez faire exactement cela avec des objets dynamiques dans C# 4, sans utiliser de réflexion même. –

Répondre

1

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.

1

Vous avez besoin de DLR, plus précisément DynamicObject.TryInvokeMember. Essentiellement, vous substituez DynamicObject avec autant de membres réguliers que vous le souhaitez, puis fournissez TryInvokeMember pour gérer d'autres appels de méthode à l'exécution

+0

Bien, je l'ai eu. Est-il nécessaire d'utiliser VS2010 pour utiliser C# 4.0? –

+0

Non. Mono a déjà un support de base pour System.Dynamic. –

Questions connexes