首页 > 解决方案 > 可以通过 Property Accessor 识别 PropertyInfo

问题描述

假设我有一个类型MethodInfo类似于图像的对象。

在此处输入图像描述

我怎么知道它是Property Accessor

有没有办法通过 来确定PropertyInfo对象MethodInfo

标签: c#reflection

解决方案


我认为实现这一点的最简单方法是从属性-> 方法创建方法-> 属性的查找。

我把它放在一起用于从给定类的属性中检索关联的访问器。首先,我创建了一个简单的数据结构来存储信息:

public class AccessorDescriptor
{
    public bool IsGetter { get; }
    public bool IsSetter { get; }
    public MethodInfo MethodInfo { get; }
    public PropertyInfo PropertyInfo { get; }

    public AccessorDescriptor(MethodInfo methodInfo, PropertyInfo propertyInfo, bool isGetter, bool isSetter)
    {
        this.MethodInfo = methodInfo;
        this.PropertyInfo = propertyInfo;
        this.IsGetter = isGetter;
        this.IsSetter = isSetter;
    }
}

然后是提取它的方法:

private static IList<AccessorDescriptor> GetPropertyAccessors<TTarget>()
{
    return GetPropertyAccessors(typeof(TTarget));
}

private static IList<AccessorDescriptor> GetPropertyAccessors(Type targetType)
{
    // I believe this should ensure that we catch all defined properties
    var allProps = targetType.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty | BindingFlags.SetProperty);

    // Create a list which will support all of the properties getters and setters
    var result = new List<AccessorDescriptor>(allProps.Count() * 2);

    foreach (var prop in allProps)
    {
        // Get the properties accessors
        foreach (var accessor in prop.GetAccessors(true))
        {
            // Determine if it's a getter or a setter
            if (accessor.ReturnType == typeof(void))
            {
                result.Add(new AccessorDescriptor(accessor, prop, isGetter: false, isSetter: true));
            }
            else
            {
                result.Add(new AccessorDescriptor(accessor, prop, isGetter: true, isSetter: false));
            }
        }
    }
    // Return the list
    return result;
}

如果您需要进行大量查找或有一个大类,我建议使用 MethodInfo -> AccessorDescriptor 的字典,但这取决于您。然后,您可以使用列表(或字典)从任何访问器的 MethodInfo 中查找 PropertyInfo。


推荐阅读