是否可以将属性添加到分部类中的属性?

我不认为这是可能的,但由于我没有明确的MSDN清晰度,我觉得最好问一下。 假设我们有一个类如下。

public partial class Hazaa { public int Shazoo { get; set; } } 

然后,我想将Shazoo归为SuperCool, 我希望在另一个文件中这样做。 由于我使用的是部分类,我可以按如下方式添加新属性。

 public partial class Hazaa { [SuperCool] public int Wheee { get; set; } } 

但是,我可以通过在后者中编写代码来声明第一个样本中声明的属性吗? 我怀疑这是可能的,但我很乐意经过纠正。 如果是这样,语法是什么?

不,你不能。

您只能将属性附加到您在那里声明的成员,然后,除非该成员也被声明为部分(以便您可以在其他地方重新实现),您不能将属性附加到在另一个部分文件中声明的成员。

根据您的要求,您可以考虑使用以下选项:

  • MetadataType属性

您可以通过这种方式注册的属性实际上不是您的类属性,但大多数框架使用它们就像您的类本机属性一样。

如果要添加数据注释属性,特别是在ASP.NET MVC项目中,您会发现这种方式很有帮助。

此外,对于不支持MetadataTypeAttribute其他框架(如Windows Forms ,您只需使用AssociatedMetadataTypeTypeDescriptionProvider添加支持即可。

解决方案不仅限于数据注释属性,您可以使用对您的库和框架有意义的所有类型的属性。

如何定义其他属性?

您可以创建一个元数据类,其中包含由适当属性修饰的原始类的属性,然后通过MetadataType属性修饰分部类,并为您的原始类引入元数据类。

如何看待这些属性的影响?

ASP.NET MVC这样的ASP.NET MVC使用这些属性,就像它们在原始类中定义的那样。

您还可以将AssociatedMetadataTypeTypeDescriptionProvider注册为原始类型的提供者,以用于可能希望使用TypeDescriptor获取有关您的类型的信息的其他框架或组件。

他们真的是我的阶级属性吗?

请注意,这样,属性实际上不属于您的原始类,但对于大多数框架,如使用TypeDescriptor获取类型信息的ASP.NET MVCWindows Forms ,它们就像您的类原始属性一样。

因此,如果要使用reflection获取属性的属性,则无法看到它们,但如果使用TypeDescriptor机制,则可以看到它们。

一个例子

哈扎class:

 public partial class Hazaa { public int Shazoo { get; set; } } 

HazaaMetadata类

 [MetadataType(typeof(HazaaMetadata))] public partial class Hazaa { } public class HazaaMetadata { [DisplayName("Shazoo Name")] public int Shazoo { get; set; } } 

ASP.NET MVC用法

你不需要做任何其他事情来使DisplayName工作,你可以简单地使用Html.LabelforHtml.DisplayNameForm来查看影响。 它将“Shazoo Name”显示为标签文本。

Windows窗体用法

您的应用程序中的某些位置(如表单加载,main,…)以这种方式注册提供程序:

 var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa)); TypeDescriptor.AddProvider(provider, typeof(Hazaa)); 

因此,您将看到PropertyGridDataGridView使用“Shazoo Name”作为属性和列标题的标题。

当然,您可以使用元数据执行以下操作:

 public partial class Hazaa : EntityBase { public int Shazoo { get; set; } } [MetadataTypeAttribute(typeof(HazaaMetadata))] public partial class Hazaa : EntityBase { internal sealed class HazaaMetadata { [SuperCool] public int Shazoo { get; set; } } }