利用Attribute获取不同的数据

818 阅读2分钟

背景

假设现在有A,B两个系统,现在要将这两个系统进行集成。

A系统里有一个表单数据,现在需要解析这个表单数据,写入B系统中。

由于测试的需要,再加上A系统的限制,所以一张表单会有两个版本,一个版本是生产环境使用,一个版本是测试环境使用。但是同一个表单的数据结构是相同,只是字段的key值不用

例如某个表单生产环境的数据结构:

{
    "data":{
        "fobc15c1c700194da195c7745f3390391a2":"111",
        "fof9100af150cb46d7adde2970b7891c273":"222",
        "fo2be8ddfea4eb42968a42c6a848d972f21":"333"
    }
}

对应测试环境的数据结构:

{
    "data":{
        "fobc15c1c700194da195c7745f3390391a3":"111",
        "fof9100af150cb46d7adde2970b7891c274":"222",
        "fo2be8ddfea4eb42968a42c6a848d972f25":"333"
    }
}

目前希望实现的效果是:一套代码根据当前环境(生产/测试),自动获取相应的字段key值。

我们使用Attribute来达到这个效果,这是MSDN对它的解释:

Attribute类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。 目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性、返回值、结构或其他属性。

如何实现

首先,创建一个类BankCompanyAttribute,继承AttributeBankCompanyAttribute中的代码直接复制DescriptionAttribute

DescriptionAttribute的版本:System, Version=4.0.0.0,如果是System.ComponentModel.Primitives, Version=4.2.2.0的版本会报错

    public class BankCompanyAttribute: Attribute
    {
        public static readonly DescriptionAttribute Default = new DescriptionAttribute();

        private string description;

        public virtual string Description => DescriptionValue;

        protected string DescriptionValue
        {
            get
            {
                return description;
            }
            set
            {
                description = value;
            }
        }

        public BankCompanyAttribute() : this(string.Empty) {}

        public BankCompanyAttribute(string description)
        {
            this.description = description;
        }

        public override bool Equals(object obj)
        {
            if (obj == this)
            {
                return true;
            }

            DescriptionAttribute descriptionAttribute = obj as DescriptionAttribute;
            if (descriptionAttribute != null)
            {
                return descriptionAttribute.Description == Description;
            }

            return false;
        }

        public override int GetHashCode()
        {
            return Description.GetHashCode();
        }

        public override bool IsDefaultAttribute()
        {
            return Equals(Default);
        }

接着:在Main函数中读取相关特性:

    public class Dev
    {
        [Description("fadsa11")]
        [BankCompany("asdf")]
        public string Name { get; set; }

        [Description("111")]
        [BankCompany("fadsa11")]
        public string Description { get; set; }
    }
    
    public class Program
    {
        static void Main(string[] args)
        {
            Type clsType = typeof(Dev);
            PropertyInfo[] propertyInfos = clsType.GetProperties();
            foreach (var item in propertyInfos)
            {
                var customAttribute = Attribute.GetCustomAttribute(item, typeof(DescriptionAttribute));
                Console.WriteLine(((DescriptionAttribute)customAttribute).Description);
                var bankCompany = BankCompanyAttribute.GetCustomAttribute(item, typeof(BankCompanyAttribute));
                Console.WriteLine(((BankCompanyAttribute)bankCompany).Description);
            }
        }
    }    

结果:

image.png

现在,完全可以根据环境来自由获取生产/测试环境的key了。