2015-09-01 1 views
1

J'utilise la réflexion pour créer une liste de méthodes que l'utilisateur utiliserait dans un menu généré dynamiquement (I'am in unity). Je suis en utilisant:Comment obtenir une liste de méthodes personnalisées avec réflexion en C#

MethodInfo[] methodInfos = myObject.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); 

Mais pas toutes les méthodes publiques de la classe doit apparaître dans ce menu, donc je me demandais, est-il un drapeau que je pouvais utiliser pour marquer seulement les méthodes que je besoin?

Ensuite, utilisez ce "drapeau personnalisé" pour obtenir ces méthodes par réflexion. Merci :).

+0

marquez les méthodes dont vous avez besoin avec l'attribut personnalisé – ASh

Répondre

7

Utiliser l'attribut personnalisé:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class MenuItemAttribute : Attribute 
{ 
} 

et permettent à l'utilisateur de marquer des méthodes:

public class Foo 
{ 
    [MenuItem] 
    public void Bar() {} 
} 

Ensuite, sur les méthodes recherche, inspecter les métadonnées pour cet attribut:

var methodInfos = myObject 
    .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) 
    .Where(_ => _.IsDefined(typeof(MenuItemAttribute))); 

Si vous besoin de fournir une possibilité pour l'utilisateur de définir le chemin du menu, puis étendre votre attribut avec paramètre personnalisé, quelque chose comme ceci:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class MenuItemAttribute : Attribute 
{ 
    public MenuItemAttribute(string menuPath) 
    { 
     MenuPath = menuPath; 
    } 

    public string MenuPath { get; } 
} 

Une autre option est de jeter façon personnalisée pour faire des plugins et utiliser quelque chose hors de la boîte, par exemple, MEF.

+0

Hey, merci! Très bonne réponse ! Cependant, je n'ai pas de définition pour la méthode "Where", qu'est-ce qui me manque? System.Reflection.MethodInfo [] 'ne contient pas de définition de 'Où' – Byzs

+0

Eh bien, je suppose que l'API change de la version Unity C# et .NET C#, j'ai finalement résolu ceci avec cette réponse SO: [Comment devrais-je utiliser la réflexion ...] (http://stackoverflow.com/questions/2831809/how-would-i-use-reflection-to-call-all-the-methods-that-has-a-certain-custom-att Mais votre réponse a été très utile et m'a mis sur la bonne voie, merci @Dennis – Byzs

+0

Ceci est la méthode d'extension de l'espace de noms System.Linq. Ce n'est pas lié à l'API Unity. – Dennis

2

Vous pouvez utiliser le code ci-dessous. Il renvoie à la fois les méthodes publiques et non publiques.

MethodInfo[] methodInfos = myObject.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);