C# 如何使属性知道它所在的属性的名称?

C# 如何使属性知道它所在的属性的名称?,c#,attributes,custom-attributes,C#,Attributes,Custom Attributes,我想实现一个简单的属性,用于将数据库列映射到属性 因此,到目前为止,我得到的是这样的东西: [DataField("ID")] public int ID { get; set; } [DataField("Name")] public String Name { get; set; } [DataField("BirD8")] public DateTime BirthDay { get; set; } 是否有一种方法可以让属性“意识到”它

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

因此,到目前为止,我得到的是这样的东西:

    [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; }

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

为了简化操作,您可能希望在属性上编写一个方法,以允许它将其信息与属性中的信息合并,因此您可以调用:

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
dfa = dfa.MergeWith(propertyInfo);
请注意,为了保持理智,这应该创建属性的新实例,而不是更改现有实例。或者,您可能需要一个完整的单独类来表示“关于数据字段的信息”:


通过这种方式,您还可以构建
DataFieldInfo
对象,而无需对属性进行任何引用,这可能是一种很好的概念分离-允许您轻松地从XML文件或类似文件加载配置,如果您愿意的话。

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

为了简化操作,您可能希望在属性上编写一个方法,以允许它将其信息与属性中的信息合并,因此您可以调用:

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
dfa = dfa.MergeWith(propertyInfo);
请注意,为了保持理智,这应该创建属性的新实例,而不是更改现有实例。或者,您可能需要一个完整的单独类来表示“关于数据字段的信息”:


通过这种方式,您还可以构建
DataFieldInfo
对象,而无需对属性进行任何引用,这可能是一种很好的概念分离-允许您轻松地从XML文件或类似文件加载配置(如果您愿意)。

如果您不介意使用postsharp,您可以查看,在前面的一个问题上,我问了一个很接近的问题。我最终使用编译时验证来完成我想做的事情,尽管还有其他选项,比如CompileTimeInitalize

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

    //....
}

如果您不介意使用postsharp,您可以查看我之前提出的一个问题,该问题非常接近。我最终使用编译时验证来完成我想做的事情,尽管还有其他选项,比如CompileTimeInitalize

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

    //....
}

当您不拥有处理属性的代码时,就会出现问题。我们在本地化属性方面面临这个问题,这也可能是验证属性和其他方面的问题。我们有一些属性,我们需要在其中传递属性的名称和它定义为参数的类的类型,这是非常糟糕的。如果您不拥有处理属性的代码,那么它可能是在假设属性总是有限制的情况下设计的,即您不能访问目标。我同意这有点痛。谢谢。我设法在一个解决方案中使用撬杠,在这个解决方案中我反映了属性。当您不拥有处理属性的代码时,就会出现问题。我们在本地化属性方面面临这个问题,这也可能是验证属性和其他方面的问题。我们有一些属性,我们需要在其中传递属性的名称和它定义为参数的类的类型,这是非常糟糕的。如果您不拥有处理属性的代码,那么它可能是在假设属性总是有限制的情况下设计的,即您不能访问目标。我同意这有点痛。谢谢。我设法在一个解决方案中使用撬棍,在该解决方案中我反映了属性。谢谢。我不能在这里使用这种方法,但我现在知道postsharp的存在以及它可以做什么。非常感谢,谢谢。我不能在这里使用这种方法,但我现在知道postsharp的存在以及它可以做什么。非常感谢。