使用BindingFlags过滤“自己的成员”

时间:2011-11-22 13:35:19

标签: c# properties 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";
    }
}

然后我想过滤属性,这样我才能获得SpeedValue属性。 我认为以下代码没问题,但它不起作用:

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

在“道具”中我得到了SpeedValue和Name属性,但在“filteredProps”中我什么都没得到...... 有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

根据the documentation

  

您必须指定BindingFlags.Instance或BindingFlags.Static才能获得返回。

     

指定BindingFlags.Public以在搜索中包含公共属性。

因此,以下应该做你想做的事:

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

答案 1 :(得分:1)

开始传递BindingFlags后,您需要准确指定所需内容。

添加BindingFlags.Instance | BindingFlags.Public

答案 2 :(得分:0)

您可以为要使用的属性提供自定义属性,并对其进行查询。我用这种方式只将某些属性显示在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);
     }
   }