如何让属性知道它所属的属性的名称?

时间:2009-10-20 06:47:10

标签: c# attributes custom-attributes

我想实现一个简单的属性,用于将数据库列映射到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; }

2 个答案:

答案 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;

    //....
}