c#之DescriptionAttribute特性(Attribute)的使用

1.前言

        在项目中遇到需要访问类中属性名,但又需要重定义属性名的情况。这里使用DescriptionAttribute标签实现。


2.代码


2.1实体类ParamsetMoadel
 

 public  class ParamSetModel : INotify
    {
        public bool IsColour { get; set; } = true;

        private int _id;
        public int Id
        {
            get { return _id; }
            set
            {
                if (_id == value) return;
                _id = value;
                OnPropertyChanged();
            }
        }

        private bool _IsCheck;
       
        public bool IsCheck
        {
            get { return _IsCheck; }
            set
            {
                if (_IsCheck == value) return;
                _IsCheck = value;
                OnPropertyChanged();
            }
        }
        private string _paramCode;
        [Description("参数编码")]
        public string ParamCode
        {
            get { return _paramCode; }
            set
            {
                if (_paramCode == value) return;
                if (_paramCode != null&& IsColour)
                {
                    ParamCodeColour = "#ff1047";
                }
                _paramCode = value;
                
                OnPropertyChanged();
            }
        }
        private string _paramName;
        [Description("参数名称")]
        public string ParamName
        {
            get { return _paramName; }
            set
            {
                if (_paramName == value) return;
                if (_paramName != null && IsColour)
                {
                    ParamNameColour = "#ff1047";
                }
                _paramName = value;
                OnPropertyChanged();
            }
        }
        private string _upperValue;
        [Description("配方上限值")]
        public string UpperValue
        {
            get { return _upperValue; }
            set
            {
                if (_upperValue == value) return;
                if (_upperValue != null && IsColour)
                {
                    UpperValueColour = "#ff1047";
                }
                _upperValue = value;
                OnPropertyChanged();
            }
        }
        private string _lowerValue;
        [Description("配方下限值")]
        public string LowerValue
        {
            get { return _lowerValue; }
            set
            {
                if (_lowerValue == value) return;
                if (_lowerValue != null && IsColour)
                {
                    LowerValueColour = "#ff1047";
                }
                _lowerValue = value;
                OnPropertyChanged();
            }
        }
        private string _setValue;
        [Description("配方设定值")]
        public string SetValue
        {
            get { return _setValue; }
            set
            {
                if (_setValue == value) return;
                if (_setValue != null && IsColour)
                {
                    SetValueColour = "#ff1047";
                }
                _setValue = value;
                OnPropertyChanged();
            }
        }




        private string _paramCodeColour = "#3F4043";
        public string ParamCodeColour
        {
            get { return _paramCodeColour; }
            set
            {
                if (_paramCodeColour == value) return;
                _paramCodeColour = value;
                OnPropertyChanged();
            }
        }
        private string _paramNameColour = "#3F4043";
        public string ParamNameColour
        {
            get { return _paramNameColour; }
            set
            {
                if (_paramNameColour == value) return;
                _paramNameColour = value;
                OnPropertyChanged();
            }
        }
        private string _upperValueColour = "#3F4043";
        public string UpperValueColour
        {
            get { return _upperValueColour; }
            set
            {
                if (_upperValueColour == value) return;
                _upperValueColour = value;
                OnPropertyChanged();
            }
        }
        private string _lowerValueColour = "#3F4043";
        public string LowerValueColour
        {
            get { return _lowerValueColour; }
            set
            {
                if (_lowerValueColour == value) return;
                _lowerValueColour = value;
                OnPropertyChanged();
            }
        }
        private string _setValueColour = "#3F4043";
        public string SetValueColour
        {
            get { return _setValueColour; }
            set
            {
                if (_setValueColour == value) return;
                _setValueColour = value;
                OnPropertyChanged();
            }
        }


    }

2.2调用方法


//应用在了DataTable转换成List实例当中,导入dataTable表头为中文,需要跟属性名称对应上,所以这里采用特性的方法解决

  public  List<T> TableToListModel<T>(DataTable dt) where T : new()
        {
            // 定义集合    
            List<T> ts = new List<T>();

            // 获得此模型的类型   
            Type type = typeof(T);
            string tempName = "";

            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                // 获得此模型的公共属性      
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;  // 检查DataTable是否包含此列
                    if (pi.IsDefined(typeof(DescriptionAttribute), true))//判断是否应用DescriptionAttribute特性
                    {
                        tempName = pi.GetCustomAttribute<DescriptionAttribute>().Description;//获取该属性的特性值
                    }

                    if (dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter      
                        if (!pi.CanWrite) continue;
                        object value = dr[tempName];
                        if (value != DBNull.Value)
                            pi.SetValue(t, value.ToString(), null);
                    }
                }
                ts.Add(t);
            }
            return ts;
        }

结论
        

该问自己记录学习使用

C# 中的自定义控件特性可以通过使用 .NET Framework 中的 `System.ComponentModel` 命名空间来实现。这些特性可以为控件提供额外的元数据,使其在设计时和运行时具有更丰富的功能和行为。 以下是一些常见的自定义控件特性: 1. `BrowsableAttribute`: 指示控件的属性是否应该在属性窗格中显示。如果将其设置为 `false`,则在设计时不会显示该属性,默认值为 `true`。 2. `CategoryAttribute`: 定义属性在属性窗格中所属的类别。可以根据需要将属性分组,并使其更易于组织和查找。 3. `DescriptionAttribute`: 提供对属性或控件的简短描述。这对于在属性窗格中显示有关属性的提示信息很有用。 4. `DefaultValueAttribute`: 指定属性的默认值。当用户在设计时创建一个新实例或重置属性时,将使用该值。 5. `EditorAttribute`: 指定与属性关联的自定义编辑器。自定义编辑器可以提供更复杂的交互和编辑体验,例如下拉列表或日期选择器。 6. `BindableAttribute`: 标识是否可以将属性绑定到数据源。如果设置为 `true`,则可以通过数据绑定机制将该属性与其他数据进行关联。 这些特性可以通过在自定义控件的属性上应用相应的特性来实现。例如: ```csharp using System.ComponentModel; public class MyCustomControl : Control { [Browsable(true)] [Category("MyCategory")] [Description("This is my custom property.")] [DefaultValue(true)] public bool MyProperty { get; set; } [Browsable(true)] [Category("MyCategory")] [Description("This is my custom event.")] public event EventHandler MyEvent; // ... } ``` 通过使用这些自定义控件特性,可以提供更好的设计时体验,并使控件更易于使用和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值