根据您的要求,您可以考虑使用以下选项:
注意: 您可以通过这种方式注册的属性实际上并不是您的类属性,但大多数框架(如 ASP.NET MVC)将它们用作您的类原生属性。
如果您想添加数据注释属性,特别是在 ASP.NET MVC 项目中,您会发现这种方式很有帮助。
对于不支持MetadataTypeAttribute 的其他框架,例如Windows Forms,您可以使用AssociatedMetadataTypeTypeDescriptionProvider 简单地添加支持。
解决方案不限于数据注释属性,您可以使用对您的库和框架有意义的所有类型的属性。
如何定义附加属性?
您可以创建一个元数据类,其中包含由适当属性修饰的原始类的属性,然后用MetadataType 属性修饰部分类并为您的原始类引入元数据类。
如何查看这些属性的影响?
像ASP.NET MVC 这样的框架使用这些属性,就像它们在您的原始类中定义的一样。
您还可以将AssociatedMetadataTypeTypeDescriptionProvider 注册为您的原始类型的提供者,以便其他可能希望使用TypeDescriptor 来获取有关您的类型的信息的框架或组件。
它们真的是我的类属性吗?
请注意,这样,属性确实不属于您的原始类,但是对于大多数框架,例如使用TypeDescriptor 获取类型信息的ASP.NET MVC 或Windows Forms,它们的行为就像您的类原始属性。
所以如果你想使用反射来获取一个属性的属性,你是看不到它们的,但是如果你使用TypeDescriptor机制,你就可以看到它们。
一个例子
Hazaa 类:
public partial class Hazaa
{
public int Shazoo { get; set; }
}
Hazaa 元数据类
[MetadataType(typeof(HazaaMetadata))]
public partial class Hazaa
{
}
public class HazaaMetadata
{
[DisplayName("Shazoo Name")]
public int Shazoo { get; set; }
}
ASP.NET MVC 用法
您无需执行任何其他操作即可使DisplayName 工作,您只需使用Html.Labelfor 或Html.DisplayNameFor 即可查看效果。它将显示“Shazoo 名称”作为标签文本。
Windows 窗体使用
在您的应用程序中的某些地方(如表单加载、main、...)以这种方式注册提供程序:
var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa));
TypeDescriptor.AddProvider(provider, typeof(Hazaa));
因此,您将看到 PropertyGrid 和 DataGridView 使用“Shazoo 名称”作为属性和列标题的标题。