Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用用户定义的标记(自定义属性)区分类属性_C#_Custom Attributes - Fatal编程技术网

C# 如何使用用户定义的标记(自定义属性)区分类属性

C# 如何使用用户定义的标记(自定义属性)区分类属性,c#,custom-attributes,C#,Custom Attributes,背景: 我有一个自定义类,它表示一个数据库表,每个属性对应一个表列。这些属性可以用三种方式进行分类 示例:以Person对象为例 元属性:(程序需要的列) 人员ID:用于表中的索引等 UserDefinedType:(UDT),处理表写入权限的复杂类 时间戳:需要在C#数据表中处理UDT 真实属性:(描述真实人物的真实特征) 全名 出生日期 出生地点 眼睛颜色 等等。。。(更多) RawDataProperties:(这些列保存来自外部源的原始数据) Phys_EyeColor:直接

背景: 我有一个自定义类,它表示一个数据库表,每个属性对应一个表列。这些属性可以用三种方式进行分类

示例:以Person对象为例

  • 元属性:(程序需要的列)
    • 人员ID:用于表中的索引等
    • UserDefinedType:(UDT),处理表写入权限的复杂类
    • 时间戳:需要在C#数据表中处理UDT
  • 真实属性:(描述真实人物的真实特征)
    • 全名
    • 出生日期
    • 出生地点
    • 眼睛颜色
    • 等等。。。(更多)
  • RawDataProperties:(这些列保存来自外部源的原始数据)

    • Phys_EyeColor:直接从物理特征数据库导入的眼睛颜色可能格式未知,可能与其他数据库的输入值冲突,或任何其他数据质量问题
    • HR_全名:HR文件中给出的全名
    • Web_全名:取自Web表单的全名
    • Web_EyeColor:取自Web表单的眼睛颜色
    • 等等
    公共阶层人士 {

    }

问题:如何以编程方式区分Person类中这三种类型的属性?目标是能够使用
System.Reflection
或其他组织结构来迭代特定类型的属性。伪代码:

foreach(Property prop in Person.GetPropertiesOfType("RealProperty"){
... doSmth(prop);
}
我正在考虑编写自定义属性,并将它们挂在属性上,有点像taggin。 但是由于我对自定义属性一无所知,我想问一下我是否走上了正确的道路,或者是否有其他更好的方法来实现这一点


注意:所示示例在程序设计方面可能不是最好的,我很清楚继承或拆分类可以解决这个问题。但这不是我的问题-我想知道是否可以标记类中的属性,或者以某种方式区分使用自定义类别的属性

您可以使用自定义属性来实现这一点

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
    public class PropertyAttribute : System.Attribute
    {
       public PropertyType Type { get; private set; }
       public PropertyAttribute (PropertyType type) { Type = type; }
    }

    public enum PropertyType
    {
       Meta,
       Real,
       Raw,
    }
然后,可以对每个属性或字段执行此操作:

[PropertyType(PropertyType.Meta)]
public int Person_ID;
[PropertyType(PropertyType.Real)]
public string FullName;
[PropertyType(PropertyType.Raw)]
public string Phys_EyeColor;
然后,您可以通过以下方式访问它

foreach (PropertyAttribute attr in this.GetType().GetCustomAttributes(typeof(PropertyAttribute), false))
{
    // Do something based on attr.Type
}

旁注:属性有getter和setter。你的例子没有,所以它们在技术上是领域。通常情况下,这并不重要,但如果您尝试迭代所有属性,但将它们声明为字段,那么您将不会得到预期的结果。@Bobson y对不起,我不适合略过这个示例。我会纠正它的属性…不用担心-这只是一个头部,因为我已经运行了很多次,我自己的冲突。
foreach (PropertyAttribute attr in this.GetType().GetCustomAttributes(typeof(PropertyAttribute), false))
{
    // Do something based on attr.Type
}