2012-03-26 9 views
3
[AttributeUsage(AttributeTargets.Method,AllowMultiple=true)] 
public class MethodId : Attribute 
{ 
    private int mId; 
    public MethodId(int mId) 
    { 
     this.mId = mId; 
    } 

    public int methodId 
    { 
     get { return this.mId; } 
     set { this.mId = value; } 
    } 
} 

public class Methods 
{ 
    [MethodId(1)] 
    public void square() 
    {  } 

    [MethodId(2)] 
    public void Notify() 
    {  } 
} 

Wie Platz für den Zugriff auf() in main() oder in einer anderen Klasse mit Hilfe von methodId?Methode mit Attributwert in C#

Antwort

8
private static MethodInfo GetMethodInfo(int id) 
{ 
     return typeof(Methods).GetMethods(). 
      Where(x => x.GetCustomAttributes(false).OfType<MethodId>().Count() > 0) 
      .Where(x => x.GetCustomAttributes(false).OfType<MethodId>().First().methodId == id) 
      .First(); 
} 

Und Nutzung:

var methodInfo = GetMethodInfo(1); 
methodInfo.Invoke(new Methods(), null); 

HINWEIS:

Diese Lösung nur angezeigt werden soll, ist, wie es zu tun. Nicht für die Leistung omptimiert. Idealerweise würden Sie Cache die MethodeInfos.

+0

Bitte erläutern Sie: methodInfo.Invoke (new Methods(), null); – Milee

+1

Die Methode ist nicht statisch, also brauchen Sie eine Instanz, um sie auszuführen, daher 'new Methods()'. Die andere ist die Parameter, die es keine hat daher "null". – Aliostad

+0

Ok ... Aber "new Methods()" ist eine Instanz erstellt, um welche Methode aufzurufen? Es ist nur ein neues Objekt. Ich kann das nicht verstehen. Was genau passieren wir? :) – Milee