背景
假设现在有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,继承Attribute,BankCompanyAttribute中的代码直接复制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);
}
}
}
结果:
现在,完全可以根据环境来自由获取生产/测试环境的key了。