我不认为这是可能的,但由于我从MSDN中得到了明确的清晰度,我觉得最好问一下。假设我们有一个类如下。
public partial class Hazaa
{
public int Shazoo { get; set; }
}
然后,我希望将 Shazoo 归为 SuperCool ,但我希望在另一个文件中这样做。由于我使用了部分类,因此我可以添加新属性,如下所示。
public partial class Hazaa
{
[SuperCool]
public int Wheee { get; set; }
}
但是我可以通过在后者中编写代码来归因第一个样本中声明的属性吗?我怀疑它是可能的,但我很高兴能够得到纠正。如果是这样,语法是什么?
答案 0 :(得分:17)
根据您的要求,您可以考虑使用以下选项:
您可以通过这种方式注册的属性并不是您的类属性,但大多数框架都使用它们,就像您的类本机属性一样。
如果您想添加数据注释属性,特别是在ASP.NET MVC
项目中,您会发现这种方式很有帮助。
对于不支持Windows Forms
的{{1}}等其他框架,您只需使用AssociatedMetadataTypeTypeDescriptionProvider
添加支持。
解决方案不仅限于数据注释属性,您可以使用对您的库和框架有意义的所有类型的属性。
如何定义其他属性?
您可以创建一个元数据类,其中包含由适当属性修饰的原始类的属性,然后按MetadataTypeAttribute
属性修饰分部类,并为您的原始类引入元数据类。
如何查看这些属性的影响?
像MetadataType
这样的框架使用这些属性,就像它们在原始类中定义一样。
此外,您可以将AssociatedMetadataTypeTypeDescriptionProvider
注册为原始类型的提供者,以用于可能希望使用ASP.NET MVC
获取有关您的类型的信息的其他框架或组件。
他们真的属于我的班级属性吗?
请注意,这种方式,属性确实不属于您的原始类,但对于大多数框架,例如TypeDescriptor
或ASP.NET MVC
使用Windows Forms
获取有关的信息类型,它们就像你的类原始属性。
因此,如果您想使用反射获取属性的属性,则无法看到它们,但如果您使用TypeDescriptor
机制,则可以看到它们。
示例
Hazaa课程:
TypeDescriptor
HazaaMetadata Class
public partial class Hazaa
{
public int Shazoo { get; set; }
}
ASP.NET MVC用法
您无需执行任何其他操作即可使[MetadataType(typeof(HazaaMetadata))]
public partial class Hazaa
{
}
public class HazaaMetadata
{
[DisplayName("Shazoo Name")]
public int Shazoo { get; set; }
}
正常工作,您只需使用Html.Labelfor
或Html.DisplayNameForm
即可查看其影响。它会将“Shazoo Name”显示为标签文本。
Windows窗体使用
应用程序中的某些位置(如表单加载,main,...)以这种方式注册提供程序:
DisplayName
因此,您会看到var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa));
TypeDescriptor.AddProvider(provider, typeof(Hazaa));
和PropertyGrid
使用“Shazoo名称”作为属性和列标题的标题。
答案 1 :(得分:5)
不,你不能。
您只能将属性附加到您在那里声明的成员,除非该成员也被声明为部分(以便您可以在其他地方重新实现),您不能将属性附加到在另一个部分文件中声明的成员。
答案 2 :(得分:0)
当然,您可以使用元数据执行以下操作:
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; }
}
}
答案 3 :(得分:0)
我们能确保将小数序列化为2个小数位的最佳方法是tp:
var xmlAttributeOverrides = new XmlAttributeOverrides(); var ctrlSumAttributes = new XmlAttributes {XmlIgnore = true}; xmlAttributeOverrides.Add(typeof(Sepa.GroupHeader39),“ CtrlSum”,ctrlSumAttributes); var ser = new XmlSerializer(typeof(Sepa.Document),xmlAttributeOverrides);
公共局部类GroupHeader39 { [XmlElement(“ CtrlSum”)] 公共字符串CtrlSumString { 获取=> CtrlSum.ToString(“ F2”); 设置{/ *需要工作* /} } }
我希望这可以帮助某人解决此问题。