是否可以将属性添加到分部类中的属性?
我不认为这是可能的,但由于我没有明确的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 MVC
或Windows 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.Labelfor
或Html.DisplayNameForm
来查看影响。 它将“Shazoo Name”显示为标签文本。
Windows窗体用法
您的应用程序中的某些位置(如表单加载,main,…)以这种方式注册提供程序:
var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa)); TypeDescriptor.AddProvider(provider, typeof(Hazaa));
因此,您将看到PropertyGrid
和DataGridView
使用“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; } } }