1

我有 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)也许有一种方法可以强制订单覆盖属性适当地。

4

2 回答 2

3

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

17.2 属性规范 - MSDN

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

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

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

于 2015-09-29T18:24:28.807 回答
0

不。关键字partial意味着类(结构等)定义被拆分为两个或多个源文件,仅此而已。如果您将每个部分复制到单个文件中并删除partial关键字,它将是相同的。从技术上讲,您可以使用在 C# 中是否继承方法属性来更改派生类中的 [AttributeUsage(Inherited=false)] 属性?

于 2015-09-29T18:23:34.333 回答