是否可以在部分类中为属性添加属性?

时间:2015-12-27 13:36:13

标签: c# .net attributes partial-classes

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

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

然后,我希望将 Shazoo 归为 SuperCool ,但我希望在另一个文件中这样做。由于我使用了部分类,因此我可以添加新属性,如下所示。

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

但是我可以通过在后者中编写代码来归因第一个样本中声明的属性吗?我怀疑它是可能的,但我很高兴能够得到纠正。如果是这样,语法是什么?

4 个答案:

答案 0 :(得分:17)

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

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

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

对于不支持Windows Forms的{​​{1}}等其他框架,您只需使用AssociatedMetadataTypeTypeDescriptionProvider添加支持。

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

如何定义其他属性?

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

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

MetadataType这样的框架使用这些属性,就像它们在原始类中定义一样。

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

他们真的属于我的班级属性吗?

请注意,这种方式,属性确实不属于您的原始类,但对于大多数框架,例如TypeDescriptorASP.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.LabelforHtml.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:

  1. 使用XlmAttributeOverides忽略十进制字段,即不对其进行序列化

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);

  1. 使用局部类添加被忽略字段的字符串序列化

公共局部类GroupHeader39 { [XmlElement(“ CtrlSum”)] 公共字符串CtrlSumString { 获取=> CtrlSum.ToString(“ F2”); 设置{/ *需要工作* /} } }

我希望这可以帮助某人解决此问题。