我不认为这是可能的,但由于我没有明确的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
项目,您会发现这种方式很有帮助.
此外,对于其他Windows Forms
不支持的框架,MetadataTypeAttribute
您只需添加支持即可AssociatedMetadataTypeTypeDescriptionProvider
.
解决方案不仅限于数据注释属性,您可以使用对您的库和框架有意义的所有类型的属性.
如何定义其他属性?
您可以创建一个元数据类,其中包含由适当属性修饰的原始类的属性,然后按MetadataType
属性修饰分部类,并为原始类引入元数据类.
如何看待这些属性的影响?
框架就像ASP.NET MVC
使用它们在原始类中定义的那些属性一样.
此外,您可以AssociatedMetadataTypeTypeDescriptionProvider
为其他框架或组件注册为原始类型的提供程序,TypeDescriptor
以便获取有关您的类型的信息.
他们真的是我的阶级属性吗?
请注意,这样一来,属性真的不属于你原来的班,但对于大多数的框架,像ASP.NET MVC
或Windows Forms
在使用TypeDescriptor
以获得有关类型的信息,他们像你的类原始属性.
因此,如果您想使用反射获取属性的属性,则无法看到它们,但如果使用TypeDescriptor
机制,则可以看到它们.
一个例子
哈扎班:
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.DisplayNameFor
看到影响.它会将"Shazoo Name"显示为标签文本.
Windows窗体用法
您的应用程序中的某些位置(如表单加载,main,...)以这种方式注册提供程序:
var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa)); TypeDescriptor.AddProvider(provider, typeof(Hazaa));
因此,您将看到PropertyGrid
并DataGridView
使用"Shazoo Name"作为属性和列标题的标题.
不,你不能.
您只能将属性附加到您在那里声明的成员,然后,除非该成员也被声明为部分(以便您可以在其他地方重新实现),您不能将属性附加到在另一个部分文件中声明的成员.