通过dynamic 实现实体类属性动态新增
起因:
在项目开发中遇到一个问题 后台表单根据用户配置会产生不同的表单字段,所以表设计结构为
在tb_ArticleAttributeField保存字段基本信息 根据用户配置在表tb_ArticleAttributeValue生成字段
表设计完成时遇到了问题,表结构根据用户配置会随时改变 产生的问题就是 实体类无法固定
绑定view时没法通过Model来进行绑定
在网上找了找到两种方法
DataTable 与dynamic
这篇主要描述采用dynamic如何处理
主要是:1、继承DynamicObject
2、重写TrySetMember TryGetMember
源码如何下
/// <summary>
/// There are no comments for DTMVCCMS.Model.ArticleAttributeValue, DTMVCCMS.Model in the schema.
/// </summary>
[Table("tb_ArticleAttributeValue")]
public class ArticleAttributeValue: DynamicObject
{
/// <summary>
/// There are no comments for ArticleID in the schema.
/// </summary>
[Property("ArticleID", KeyType = KeyType.Identity)]
public virtual int ArticleID { get; set;}
private readonly Dictionary<string, object> _properties;
public ArticleAttributeValue (){}
public ArticleAttributeValue(Dictionary<string, object> properties)
{
_properties = properties;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (!_properties.Keys.Contains(binder.Name))
{
_properties.Add(binder.Name, value.ToString());
}
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _properties.TryGetValue(binder.Name, out result);
}
}
控制器调用处理
dynamic myObj = new ExpandoObject();
Dictionary<string, object> dic = new Dictionary<string, object>()
{
{"Name","Frank"},
{"Age",23},
{"Work","码农"}
};
myObj = new ArticleAttributeValue(dic);
myObj.ArticleID = 1;
return View(myObj);
View调用
<div>
年龄为: @Model.Age
</div>
<div>
姓名为: @Model.Name
</div>
<div>
ID为: @Model.ArticleID
</div>
<div>
工作: @Model.Work
</div>
效果如下: