背景 我有一个自定义类,它代表一个数据库表,每个属性对应一个表列。这些属性可以分为三种方式。
示例:以Person对象为例。
RawDataProperties :(这些列包含来自外部源的原始数据)
公共类人员 {
#region MetaProperties
public int Person_ID { get; set; }
public UserDefinedType UDT { get; set; }
public DateTime timestamp { get; set; }
#endregion
#region RealProperties
public string FullName { get; set; }
public DateTime DateOfBirth { get; set; }
public string PlaceOfBirth { get; set; }
public Color EyeColor { get; set; }
//...
#endregion
#region RawDataProperties
public string Phys_EyeColor { get; set; }
public string Phys_BodyHeight { get; set; }
public string Web_FullName { get; set; }
public string Web_EyeColor { get; set; }
public string HR_FullName { get; set; }
//...
#endregion
}
问题:如何在Person类中以编程方式区分这三种类型的属性?目标是能够使用System.Reflection
或其他组织结构迭代某种类型的属性。伪代码:
foreach(Property prop in Person.GetPropertiesOfType("RealProperty"){
... doSmth(prop);
}
我正在考虑编写自定义属性,并将它们挂在属性上,有点像taggin。 但由于我对自定义属性一无所知,我想问一下我是否走上了正确的道路,或者是否还有其他更好的方法可以做到这一点。
注意:显示的示例在程序设计方面可能不是最好的,我很清楚继承或拆分该类可以解决这个问题。但这不是我的问题 - 我想知道类中的属性是否可以使用自定义类别进行标记或以某种方式区分。
答案 0 :(得分:5)
您可以使用自定义属性执行此操作。
[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
}