“Property set method not found” error during reflection

前端 未结 3 1639
挽巷
挽巷 2021-01-07 16:56

I\'m trying to reflect over some class properties and set them programaticlly, but it looks like one of my PropertyInfo filters isn\'t working:

//Get all pub         


        
相关标签:
3条回答
  • 2021-01-07 17:10

    Thanks to ken for the information. It looks like the best solution I can get it to filter them out by testing GetSetMethod(true) in a LINQ filter:

    // 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();
    

    Alternatively, using CanRead and CanWrite:

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

    It's unclear to me whether these different approaches will yield different results for different protection levels of the get/set methods.

    0 讨论(0)
  • From the documentation:

    BindingFlags.SetProperty

    Specifies that the value of the specified property should be set. For COM properties, specifying this binding flag is equivalent to specifying PutDispProperty and PutRefDispProperty.

    BindingFlags.SetProperty and BindingFlags.GetProperty do not filter properties that are missing setters or getters, respectively.

    To check if a property can be set, use the CanWrite property.

    if (pi.CanWrite)
        pi.SetValue(this, valueFromData, null);
    
    0 讨论(0)
  • 2021-01-07 17:30

    I understand the GetProperties() method so that it returns every property that has BindingFlags.GetProperty or BindingFlags.SetProperty.
    So if you want only properties that have setters you must remove the BindingFlags.GetProperty flag. But I did not tested it so I can be wrong.

    My answer got a -1. So it seems that my answer is wrong.

    0 讨论(0)
提交回复
热议问题