Gibt es eine Möglichkeit, eine generierte Codedatei wie folgt zu erstellen:
public partial class A {
public string a {get; set;}
}
und dann in einer anderen Datei:
public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
Damit ich eine Klasse aus der Datenbank generieren lassen und sie dann mit einer nicht generierten Datei markieren kann?
c#
attributes
code-generation
partial-classes
Chris McCall
quelle
quelle
Antworten:
Ich habe so etwas in einem Artikel von Scott Guthrie gesehen (gegen Ende) - habe es aber nicht selbst versucht.
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; } }
quelle
[MetaDataType ...
jedes Mal gelöscht, wenn der Designer ausgeführt wirdMetadataType
Attribut nicht in die vom Designer generierte Datei einfügen , sondern in die andere Datei, in der die TeilklassePerson
definiert ist.Hier ist die Lösung, die ich für solche Fälle verwendet habe. Dies ist nützlich, wenn Sie automatisch generierte Klassen haben, die Sie mit Attributen dekorieren möchten. Angenommen, dies ist die automatisch generierte Klasse:
public partial class UserProfile { public int UserId { get; set; } public string UserName { get; set; } public string Firstname { get; set; } public string Lastname { get; set; } }
Angenommen, ich möchte ein Attribut hinzufügen, um anzugeben, dass UserId der Schlüssel ist. Ich würde dann eine Teilklasse in einer anderen Datei wie dieser erstellen:
[Table("UserProfile")] [MetadataType(typeof(UserProfileMetadata))] public partial class UserProfile { internal sealed class UserProfileMetadata { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } } }
quelle
MetadataType
Attribut hergestellt. Gut gemacht!UserProfile
?MetadataType
existiert nicht in .NET CoreModelMetadataType
Dies ist meine Antwort auf
verschiedene Klassendateien, oder Sie können die Metadaten in derselben Datei kombinieren, aber den Namespace beibehalten. So können sie sich offensichtlich sehen.
Denken Sie daran, wenn Sie Ihr Modell aktualisieren, z. B. indem Sie weitere Spalten hinzufügen, müssen Sie auch die Projektklasse aktualisieren.
--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 { }
quelle
Sie müssen eine Teilklasse für Ihre
A
Klasse wie im folgenden Beispiel definierenusing 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; } }
quelle
Nicht als solches; Der Compiler wird sich beschweren, dass das Mitglied in mehreren Teilen definiert ist. Da die Verwendung von benutzerdefinierten Attributen jedoch reflektierender Natur ist, können Sie eine "Metadaten" -Klasse definieren und sie zum Enthalten von Dekoratoren verwenden.
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();
quelle