反射过程中出现“找不到属性集方法”错误

时间:2012-02-20 15:55:03

标签: c# .net reflection

我正在尝试反映一些类属性并以编程方式设置它们,但看起来我的PropertyInfo过滤器之一无效:

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter.
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty );

我在线上收到错误

pi.SetValue(this, valueFromData, null);

由于该属性只有get{}方法,因此没有set{}方法。

我的问题是,为什么这个属性没有过滤掉道具?我认为这是BindingFlags.SetProperty的目的。

未过滤掉的属性是:

    public String CollTypeDescription
    {
        get { return _CollTypeDescription; }
    }

请注意,我希望过滤不会提前工作的属性,因为我会立即列出所有属性。我确实想要使用pi.GetSetMethod()来确定我是否可以使用setter。

3 个答案:

答案 0 :(得分:61)

来自文档:

  

BindingFlags.SetProperty

     

指定应设置指定属性的值。对于   指定此绑定标志的COM属性等效于   指定PutDispProperty和PutRefDispProperty。

BindingFlags.SetPropertyBindingFlags.GetProperty 过滤掉分别缺少setter或getter的属性。

要检查是否可以设置属性,请使用CanWrite属性。

if (pi.CanWrite)
    pi.SetValue(this, valueFromData, null);

答案 1 :(得分:2)

感谢ken提供的信息。它似乎是我可以通过在LINQ过滤器中测试GetSetMethod(true)来过滤它们的最佳解决方案:

// Get all public or private non-static properties declared in this class
// (e.g. excluding inherited properties) that have a getter and setter.
PropertyInfo[] props = this.GetType()
    .GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance |
                   BindingFlags.Public | BindingFlags.NonPublic)
    .Where(p => p.GetGetMethod(true) != null && p.GetSetMethod(true) != null)
    .ToArray();

或者,使用CanReadCanWrite

PropertyInfo[] props = this.GetType()
    .GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance |
                   BindingFlags.Public | BindingFlags.NonPublic)
    .Where(p => p.CanRead && p.CanWrite)
    .ToArray();

我不清楚这些不同的方法是否会对get / set方法的不同保护级别产生不同的结果。

答案 2 :(得分:-1)

我了解GetProperties()方法,以便返回具有BindingFlags.GetProperty BindingFlags.SetProperty的所有属性。
因此,如果您只想要具有setter的属性,则必须删除BindingFlags.GetProperty标志。但我没有测试它,所以我错了。

我的回答是-1。所以我的答案似乎错了。