最近接到一个需求,用Excel导入数据取匹配数据库中的数据,Excel只有第一例跟数据库的表有关联,Excel其它列不是固定不变的,这就涉及一个问题,列可能是三列,也可能是5列,怎么使用属性,怎么查询到列表展示出来,要是有动态属性就可以了(当然使用Datatable也可以实现)。然后在网上查了资料,C#还真可以用dynamic的相关特性实现动态属性。下面用实践来验证一下。
1、新建DynamicInputParams 类
新建类DynamicInputParams 并继承DynamicObject接口。在类中新建一个字典类,来存储自定义属性。最后实现了DynamicObject的TryGetMember和TrySetMember方法,这两个方法主要是获取属性和设置属性。.
class DynamicInputParams : DynamicObject{Dictionary<string, object> property = new Dictionary<string, object>();public override bool TryGetMember(GetMemberBinder binder, out object result){string name = binder.Name;return property.TryGetValue(name, out result);}public override bool TrySetMember(SetMemberBinder binder, object value){property[binder.Name] = value;return true;}}
2、使用
新建一个dynamic变量并赋值实例化的DynamicInputParams。接下来就可以自定义自己想要的属性了,多少都可以。这里我们定义了Name,Age,Sex三个字段,并输出名字。如下:
static void Main(){dynamic P = new DynamicInputParams();P.Name= "张三";P.Age = 22;P.Sex = "女";Console.WriteLine(P.Name);//也可以添加到List集合List<dynamic> List=new List<dynamic>();List.Add(P);foreach (var item in List){Console.WriteLine(item.Name);}}//输出结果:张三
原理是利用了Dynamic的特性, Dynamic介绍请点击:C#中dynamic的正确用法
结语
本文介绍了C#使用Dynamic特性实现动态属性。但是有个问题,这并未真正的实现上面的需求,增加的列的时候不能动态的取名称,留给大家一个疑问,怎么实现,欢迎留言讨论。