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 积分,解读结果公开显示在下面。

还没有人解读过这个文件。