Отфильтруйте "собственных членов" с помощью BindingFlags - PullRequest
1 голос
/ 22 ноября 2011

Я получил следующий код:

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";
    }
}

Тогда я бы хотел отфильтровать свойства, чтобы получить только свойство SpeedValue.Я думал, что следующий код будет в порядке, но он не работает:

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

в "props" Я получил свойства SpeedValue и Name, но в "FilterProps" я ничего не получил ... Любая помощь, пожалуйста

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Согласно документации ,

Вы должны указать BindingFlags.Instance или BindingFlags.Static, чтобы получить возврат.

Укажите BindingFlags.Public, чтобы включить в поиск общедоступные свойства.

Таким образом, следующее должно делать то, что вы хотите:

var filteredProps = obj.GetType().GetProperties(BindingFlags.Instance | 
                                                BindingFlags.Public |
                                                BindingFlags.DeclaredOnly);
1 голос
/ 22 ноября 2011

Как только вы начнете проходить BindingFlags, вам необходимо указать именно то, что вы хотите.

Добавить BindingFlags.Instance | BindingFlags.Public.

0 голосов
/ 22 ноября 2011

Вы можете предоставить собственный атрибут для свойств, которые вы хотите использовать, и запросить их.Я использовал этот способ, чтобы отображались только определенные свойства в качестве свойств 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);
     }
   }
...