Is the method naming for property getters/setters standardized in IL?

后端 未结 2 1035
有刺的猬
有刺的猬 2020-12-19 03:54

I have the following two methods that I am wondering if they are appropriate:

public bool IsGetter(MethodInfo method)
{
    return method.IsSpecialName
              


        
相关标签:
2条回答
  • 2020-12-19 04:01

    You could try the following:

    public bool IsGetter(MethodInfo method)
    {
        return method.DeclaringType.GetProperties().
                                    Any(propInfo => propInfo.GetMethod == method);
    }
    

    You can optionally specify the binding flags for GetProperties

    0 讨论(0)
  • 2020-12-19 04:16

    A property method has three extra characteristics, compared with a normal method:

    1. They always start with get_ or set_, while a normal method CAN start with those prefixes.
    2. The property MethodInfo.IsSpecialName is set to true.
    3. The MethodInfo has a custom attribute System.Runtime.CompilerServices.CompilerGeneratedAttribute.

    You could check on 1, combined with option 2 or 3. Since the prefixes are a standard, you should not really worry about checking on it.

    The other method is to enumerate through all properties and match the methods, which will be much slower:

    public bool IsGetter(MethodInfo method)
    {
        if (!method.IsSpecialName)
            return false; // Easy and fast way out. 
        return method.DeclaringType
            .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 
            .Any(p => p.GetGetMethod() == method);
    }
    
    0 讨论(0)
提交回复
热议问题