我收到了以下代码:
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”中我什么都没得到...... 有什么帮助吗?
答案 0 :(得分:2)
您必须指定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);
}
}