¿Hay alguna manera de que pueda tener un archivo de código generado como este?
public partial class A {
public string a {get; set;}
}
y luego en otro archivo:
public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
¿Para poder generar una clase a partir de la base de datos y luego usar un archivo no generado para marcarlo?
c#
attributes
code-generation
partial-classes
Chris McCall
fuente
fuente
Respuestas:
He visto algo como esto hecho en un artículo de Scott Guthrie (casi al final), aunque no lo intenté yo mismo.
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; } }
fuente
[MetaDataType ...
se borrará cada vez que se ejecuta de diseñoMetadataType
atributo en el archivo generado por el diseñador, lo pones en el otro archivo dondePerson
se define la clase parcial .Aquí está la solución que he estado usando para tales casos. Es útil cuando tiene clases generadas automáticamente que desea decorar con atributos. Digamos que esta es la clase generada automáticamente:
public partial class UserProfile { public int UserId { get; set; } public string UserName { get; set; } public string Firstname { get; set; } public string Lastname { get; set; } }
Y digamos, me gustaría agregar un atributo para especificar que UserId es la clave. Luego crearía una clase parcial en otro archivo como este:
[Table("UserProfile")] [MetadataType(typeof(UserProfileMetadata))] public partial class UserProfile { internal sealed class UserProfileMetadata { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } } }
fuente
MetadataType
atributo. ¡Bien hecho!UserProfile
?MetadataType
no existe en .NET CoreModelMetadataType
Esta es mi respuesta a
archivos de clases diferentes o puede combinar los metadatas en un mismo archivo pero mantener el espacio de nombres igual ... para que puedan verse obviamente.
Tenga en cuenta que cuando actualice su modelo, como agregar más columnas, también debe actualizar la clase del proyecto.
--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 { }
fuente
Necesita definir una clase parcial para su
A
clase como el siguiente ejemplousing 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; } }
fuente
No como tal; el compilador se quejará de que el miembro está definido en varias partes. Sin embargo, como el uso de atributos personalizados es de naturaleza reflexiva, puede definir una clase de "metadatos" y usarla para contener decoradores.
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();
fuente