0

我想实现一个简单的属性,用于将数据库列映射到属性。

所以到目前为止我所拥有的是这样附加的东西:

    [DataField("ID")]
    public int ID { get; set; }

    [DataField("Name")]
    public String Name { get; set; }

    [DataField("BirD8")]
    public DateTime BirthDay { get; set; }

有没有一种方法可以让属性“知道”它所在的字段,以便对于名称与 ColumnName 相同的属性,我可以只应用没有名称参数的属性,或者我必须在我反映属性的地方处理这个问题。我想最终这样做:

    [DataField]
    public int ID { get; set; }

    [DataField]
    public String Name { get; set; }

    [DataField("BirD8")]
    public DateTime BirthDay { get; set; }
4

2 回答 2

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 文件或类似文件加载配置。

于 2009-10-20T06:50:12.130 回答
1

如果您不介意使用 postsharp,您可以查看Here,在我之前问过的问题中哪个很接近。我最终使用编译时验证来做我想做的事,尽管还有其他选项,比如 CompileTimeInitalize。

public override void CompileTimeInitialize(object element)
{
    PropertyInfo info = element as PropertyInfo;

    //....
}
于 2009-10-20T07:16:56.227 回答