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

所以我有这么远的东西,连接像这样:

    [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; }
有帮助吗?

解决方案

属性本身不会知道什么它应用到,但代码的处理的属性有可能通过PropertyInfo值等运行,并找到属性与它们相关联。 代码然后可以同时使用属性和属性适当地

为了让事情变得更简单,你可能想要写的属性的方法,以允许它与从属性中的信息合并的信息,所以你会打电话:

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
dfa = dfa.MergeWith(propertyInfo);

注意,对于理智起见这应该创建属性的一个新实例,而不是改变现有的。或者,你可能需要一个完整而独立的类来表示“有关数据字段中的信息”:

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
DataFieldInfo info = dfa.MergeWith(propertyInfo);

这种方法你可以的的结构DataFieldInfo对象没有任何参考的属性,这可能是一个很好的概念分离 - 让你轻松地从一个XML文件,或者如果您想类似的东西加载配置

其他提示

如果你不介意使用postsharp你可以看看这里,在前面的问题我也问过这是接近。我最终使用的编译时间验证做我想要的东西,虽然也有其他的选择,比如CompileTimeInitalize。

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

    //....
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top