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