una tipos tipo sharp que programacion parciales parcial objetos modificador llamar falta declaración crear como clases clase c# attributes code-generation partial-classes

c# - tipos - ¿Puedo definir propiedades en clases parciales, y luego marcarlas con atributos en otra clase parcial?



que es una clase en programacion (5)

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();

¿Hay alguna manera de que pueda tener un archivo de código generado así?

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 que pueda generar una clase desde la base de datos y luego usar un archivo no generado para marcarlo?


Sé que esta es una vieja pregunta, pero esta es 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; } } }


Esta es mi respuesta
diferentes archivos de clase o puede combinar los metadatos en un mismo archivo pero manteniendo 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 de 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 { }


Necesitas definir una clase parcial para tu clase A como en el siguiente ejemplo

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; } }


He visto algo así en un artículo de Scott Guthrie (casi al final), aunque no lo probé.
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; } }