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

有没有办法,我可以有一个生成的代码文件,如下所示:

public partial class A { public string a {get; set;} } 

然后在另一个文件中:

 public partial class A { [Attribute("etc")] public string a {get; set;} } 

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

我曾经在Scott Guthrie的一篇文章(接近尾声)中看到过这样的事情 – 尽pipe我没有尝试过。
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; } } 

我知道这是一个古老的问题,但这是我一直在使用的解决scheme。 当您想要使用属性修饰自动生成的类时,它非常有用。 假设这是自动生成的类:

 public partial class UserProfile { public int UserId { get; set; } public string UserName { get; set; } public string Firstname { get; set; } public string Lastname { get; set; } } 

假设我想添加一个属性来指定UserId是关键。 然后我会在另一个文件中创build一个部分类,如下所示:

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

这是我的答案
不同的类文件,或者你可以在同一个文件中结合元数据,但保持命名空间相同,所以他们可以明显地看到对方。

记住,当你更新你的模型,像添加更多的列,你也必须更新项目类。

 --your model class public partial class A { public string a {get; set;} } --your project class public class Ametadata { [Attribute("etc")] public string a {get; set;} } [MetadataType(typeof(Ametadata))] public partial class A { } 

不是这样; 编译器会抱怨成员被定义在多个部分。 但是,由于自定义属性的使用本质上是reflection性的,所以可以定义一个“元数据”类并使用它来包含装饰器。

 public class A { public string MyString; } public class AMeta { [TheAttribute("etc")] public object MyString; } ... var myA = new A(); var metaType = Type.GetType(myA.GetType().Name + "Meta"); var attributesOfMyString = metaType.GetMember("MyString").GetCustomAttributes(); 

您需要为您的A类定义一个部分类,就像下面的例子

 using System.ComponentModel.DataAnnotations; // your auto-generated partial class public partial class A { public string MyProp { get; set; } } [MetadataType(typeof(AMetaData))] public partial class A { } public class AMetaData { [System.ComponentModel.DefaultValue(0)] public string MyProp { get; set; } }