c# - 可以通过 Property Accessor 识别 PropertyInfo
解决方案
我认为实现这一点的最简单方法是从属性-> 方法创建方法-> 属性的查找。
我把它放在一起用于从给定类的属性中检索关联的访问器。首先,我创建了一个简单的数据结构来存储信息:
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。
推荐阅读
- node.js - 在 Node.js 中创建频谱图
- html - 对齐html中的输入文本框
- reactjs - 无需 onChange 方法即可在输入文本字段中输入
- objective-c - iOS 13 TLS 问题
- pyspark - Pyspark:从列表中获取聚类特征
- regex - 如何按 nom 解析匹配的分隔符?
- php - FTPS登录成功但put失败
- javascript - 如何在Javascript中将两个数字连接成一个堆栈
- python - 我正在尝试使用 Django rest 框架创建基于微服务的架构
- c# - C#同一个应用程序的多个实例读取/更新同一个oracle表,每行处理一次