【问题标题】:Is there a way to override order of application of attributes in partial classes?有没有办法覆盖部分类中属性的应用顺序?
【发布时间】:2015-12-27 07:41:10
【问题描述】:

我有 2 个包含部分类的文件。一个生成的和一个手动的。我想覆盖、级联或以其他方式指定在编译时应用属性的顺序,以更改类成员属性之一。

生成的代码:

[Table("dbo.product_variation")]
public partial class ProductVariation
{
    [Key]
    [Column("id")]
    public int Id { get; set; }

    [Required]
    [Column("style_id")]
    public int StyleId { get; set; }

    [Required]
    [Column("name"), StringLength(400)]
    public string Name { get; set; }

    [Column("general_description"), StringLength(2048), UIHint("MultilineText")]
    public string GeneralDescription { get; set; }
}

手动代码:

[MetadataType(typeof(ProductsMetadata))]
public partial class ProductVariation
{
}

public partial class ProductsMetadata
{
    [UIHint("RichText")]
    public string GeneralDescription { get; set; }
}

这里的真正意图是用 UIHint("RichText") 覆盖 UIHint("MultilineText")。这在一台开发机器上运行良好,而不是在另一台开发机器上,这让我相信 1)也许我不应该两次指定特定属性,或者 2)也许有一种方法可以强制命令覆盖属性正确。

【问题讨论】:

    标签: c# entity-framework data-annotations asp.net-dynamic-data class-attributes


    【解决方案1】:

    这是不可能的,源中属性的顺序对编译器没有任何意义。

    17.2 Attribute specification - MSDN

    在这样的列表中指定属性的顺序,以及 附加到同一程序实体的部分的顺序 排列整齐,不重要

    当你有部分类并且在不同的源文件中使用不同的属性时,编译器只是合并它们。

    正如我所说,您不能让一个属性声明覆盖另一个声明,但是当您控制在运行时使用该属性的代码时,您可以做的是应用所有属性,应用您想要的任何顺序并且只使用其中之一。但我不认为这是你的情况。

    【讨论】:

    • 我对生成的代码和手动代码都有控制权,所以我可以做一些让步。这很清楚地回答了我的问题。谢谢!
    【解决方案2】:

    没有。关键字partial 表示类(结构等)定义被拆分为两个或多个源文件,仅此而已。如果您将每个部分复制到单个文件中并删除 partial 关键字,它将是相同的。 从技术上讲,您可以使用 [AttributeUsage(Inherited=false)] Are Method Attributes Inherited in C#?

    更改 派生 类中的属性

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多