2011-11-22 3 views
1

je suis arrivé le code suivant:filtre « propres membres » avec BindingFlags

public class PluginShape : INotifyPropertyChanged 
{ 
    private string _Name; 
    public string Name 
    { 
     get { return _Name; } 
     set 
     { 
      _Name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 

    #region Implement INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 
} 

public class SpeedGenerator : PluginShape 
{ 
    private int _SpeedValue; 
    public int SpeedValue 
    { 
     get { return _SpeedValue; } 
     set 
     { 
      _SpeedValue = value; 
      RaisePropertyChanged("SpeedValue"); 
     } 
    } 

    public SpeedGenerator() 
    { 
     Name = "DefaultName"; 
    } 
} 

J'aimerais filtrer les propriétés afin que je ne reçois que la propriété SpeedValue. Je pensais que le code suivant sera ok, mais il ne fonctionne pas:

var props = obj.GetType().GetProperties(); 
var filteredProps = obj.GetType().GetProperties(BindingFlags.DeclaredOnly); 

dans « accessoires » Je suis les deux propriétés SpeedValue et nom, mais dans « filteredProps » Je n'ai rien ... Toute aide s'il vous plaît ?

Répondre

2

Selon the documentation,

Vous devez spécifier BindingFlags.Instance ou BindingFlags.Static afin d'obtenir un retour.

Spécifiez BindingFlags.Public pour inclure les propriétés publiques dans la recherche.

Ainsi, ce qui suit devrait faire ce que vous voulez:

var filteredProps = obj.GetType().GetProperties(BindingFlags.Instance | 
               BindingFlags.Public | 
               BindingFlags.DeclaredOnly); 
+0

La liste est vide aussi :( –

+0

@GuillaumeCogranne: J'ai mis à jour ma réponse – Heinzi

+0

ok, je n'ai pas compris comment cela fonctionne, cela fonctionne, grâce à vous :) –

1

Une fois que vous commencez à passer BindingFlags, vous devez spécifier exactement ce que vous voulez.

Ajouter BindingFlags.Instance | BindingFlags.Public.

+0

J'ai essayé var filteredProps = obj.GetType(). GetProperties (BindingFlags.Instance); et la liste est vide aussi –

+0

Essaie avec "BindingFlags.Instance | BindingFlags.Public" et j'ai mes 2 propriétés, aucun filtrage n'est fait –

+0

Vous voulez toujours 'DeclaredOnly'. – SLaks

0

Vous pouvez fournir un attribut personnalisé pour les propriétés que vous souhaitez utiliser et requête sur ceux-ci. J'ai utilisé de cette façon uniquement certaines propriétés affichées en tant que propriétés ListView.

[AttributeUsage(AttributeTargets.Property)] 
public class ClassAttribute : Attribute 
{ 
    public String PropertyName; 
    public String PropertyDescription; 
} 
// Property declaration 
[ClassAttribute(PropertyName = "Name", PropertyDescription = "Name")] 
public String Name { get; private set; } 

// Enumeration 
    IEnumerable<PropertyInfo> PropertyInfos = t.GetProperties(); 
    foreach (PropertyInfo PropertyInfo in PropertyInfos) 
    { 
    if (PropertyInfo.GetCustomAttributes(true).Count() > 0) 
    { 
     PropertyInfo info = t.GetProperty(PropertyInfo.Name); 
    } 
    } 
Questions connexes