C#实现动态属性

最近接到一个需求,用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特性实现动态属性。但是有个问题,这并未真正的实现上面的需求,增加的列的时候不能动态的取名称,留给大家一个疑问,怎么实现,欢迎留言讨论。