我想实现一个简单的属性,用于将数据库列映射到Properties。
所以我到目前为止所附的东西是这样的:
[DataField("ID")]
public int ID { get; set; }
[DataField("Name")]
public String Name { get; set; }
[DataField("BirD8")]
public DateTime BirthDay { get; set; }
有没有办法可以让属性“知道”它所在的字段,这样对于名称与ColumnName相同的属性,我可以只应用没有name参数的属性,或者我必须在我反映属性时处理这个问题。我想最终做到这一点:
[DataField]
public int ID { get; set; }
[DataField]
public String Name { get; set; }
[DataField("BirD8")]
public DateTime BirthDay { get; set; }
答案 0 :(得分:3)
属性本身不会知道它应用于什么,但代码处理属性可能正在运行PropertyInfo
值等,并找到与它们相关的属性。 那个代码可以适当地使用属性和属性。
为了简化操作,您可能希望在属性上编写一个方法,以允许它将其信息与属性中的信息合并,因此您可以调用:
DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
dfa = dfa.MergeWith(propertyInfo);
请注意,为了理智,这应该创建属性的新实例,而不是更改现有属性。或者,您可能需要一个完整的单独类来表示“有关数据字段的信息”:
DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
DataFieldInfo info = dfa.MergeWith(propertyInfo);
这样你就可以 构造DataFieldInfo
个对象而不需要任何属性引用,这可能是一个很好的概念分离 - 允许你轻松地从XML文件或类似的东西加载配置如果你愿意的话。
答案 1 :(得分:1)
如果你不介意使用postharp,你可以查看Here,在之前的一个问题我已经问过哪个是关闭的。我最终使用编译时验证来做我想要的,虽然还有其他选项,比如CompileTimeInitalize。
public override void CompileTimeInitialize(object element)
{
PropertyInfo info = element as PropertyInfo;
//....
}