我可以在分部类中定义属性,然后用另一个分类中的属性标记它们吗?

Chr*_*all 72 c# attributes code-generation partial-classes

有没有办法我可以像这样生成一个代码文件:

public partial class A {
public string a {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

然后在另一个文件中:

public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

这样我可以从数据库生成一个类,然后使用非生成的文件来标记它?

Jea*_*amp 70

这是我一直在使用的解决方案.当您想要使用属性装饰自动生成的类时,它非常有用.假设这是自动生成的类:

public partial class UserProfile
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

让我们说,我想添加一个属性来指定UserId是关键.然后我会在另一个文件中创建一个部分类,如下所示:

[Table("UserProfile")]
[MetadataType(typeof(UserProfileMetadata))]
public partial class UserProfile
{
    internal sealed class UserProfileMetadata
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • .NET Core中不存在“ MetadataType” (2认同)
  • .net核心使用`ModelMetadataType` (2认同)

Dan*_*tru 30

我在Scott Guthrie的一篇文章(接近尾声)中看到过这样的事情 - 尽管如此,我并没有尝试过.
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

[MetadataType(typeof(Person_Validation))]
public partial class Person
{
    // Partial class compiled with code produced by VS designer
}

[Bind(Exclude="ID")]
public class Person_Validation
{
    [Required(ErrorMessage = "First Name Required")]
    [StringLength(50, ErrorMessage = "Must be under 50 characters")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name Required")]
    [StringLength(50, ErrorMessage = "Must be under 50 characters")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Age Required")]
    [Range(0, 120, ErrorMessage = "Age must be between 0 and 120")]
    public int Age { get; set; }

    [Required(ErrorMessage = "Email Required")]
    [Email(ErrorMessage = "Not a valid email")]
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案值得一提,但这不是OP提出的问题的一般解决方案.属性的消费者仍然需要知道查找元数据类 - 即这些属性将不会被Attribute.GetCustomAttribute(...)返回.(幸运的是,对于许多用例,消费者是由MS编写的,在某些情况下这将起作用.) (8认同)
  • @Desolator - 这个想法是你没有把`MetadataType`属性放在设计器生成的文件中,你把它放在定义了部分类`Person`的另一个文件中. (2认同)