src/DotNetCommon.Core/Accessors/AccessorBuilder.cs
(开头部分) 21KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
namespace DotNetCommon.Accessors
{
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using DotNetCommon.Extensions;
/// <summary>
/// 提供一系列快速构建<seealso cref="Accessor"/>实例的方法
/// </summary>
public static class AccessorBuilder
{
/// <summary>
/// 根据给定的属性名称采获取属性的写入逻辑
/// </summary>
/// <param name="includePrivate">是否排除private方法</param>
/// <param name="propertyName">属性名称</param>
public static Action<TInstance, TProperty> BuildSetter<TInstance, TProperty>(string propertyName, bool includePrivate = false) where TInstance : class
{
Ensure.NotNullOrEmptyOrWhiteSpace(propertyName);
if (!typeof(TInstance).TryGetInstanceProperty(propertyName, out PropertyInfo propInfo))
{
throw new InvalidOperationException("Unable to find property: " + propertyName + ".");
}
return BuildSetter<TInstance, TProperty>(propInfo, includePrivate);
}
/// <summary>
/// 根据给定的字段名称采获取字段的写入逻辑
/// </summary>
public static Action<TInstance, TProperty> BuildFieldSetter<TInstance, TProperty>(string fieldName, bool includePrivate = false) where TInstance : class
{
Ensure.NotNullOrEmptyOrWhiteSpace(fieldName);
var flags = BindingFlags.Public | BindingFlags.Instance;
if (includePrivate) flags |= BindingFlags.NonPublic;
var field = typeof(TInstance).GetFields(flags).FirstOrDefault(i => i.Name == fieldName);
if (field == null)
{
throw new InvalidOperationException("Unable to find field: " + fieldName + ".");
}
return BuildFieldSetter<TInstance, TProperty>(field);
}
/// <summary>
/// 根据给定属性信息获取属性的写入逻辑
/// </summary>
/// <param name="includePrivate">是否排除private方法</param>
/// <param name="propertyInfo">属性信息</param>
public static Action<TInstance, TProperty> BuildSetter<TInstance, TProperty>(PropertyInfo propertyInfo, bool includePrivate = false) where TInstance : class
{
Ensure.NotNull(propertyInfo, nameof(propertyInfo));
if (!propertyInfo.CanWrite)
{
throw new ArgumentException($"Property: `{propertyInfo.Name}` of type: `{propertyInfo.ReflectedType?.FullName}` does not support writing.");
}
后面还有 414 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
