Есть ли способ получить сгенерированный файл кода следующим образом:
public partial class A {
public string a {get; set;}
}
а затем в другом файле:
public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
Чтобы я мог создать класс из базы данных, а затем использовать несгенерированный файл для его разметки?
c#
attributes
code-generation
partial-classes
Крис МакКолл
источник
источник
Ответы:
Я видел нечто подобное в статье Скотта Гатри (ближе к концу) - хотя сам не пробовал.
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; } }
источник
[MetaDataType ...
будет очищаться каждый раз приMetadataType
атрибут в файл, созданный дизайнером, вы помещаете его в другой файл, где определен частичный классPerson
.Вот решение, которое я использовал для таких случаев. Это полезно, когда у вас есть автоматически сгенерированные классы, которые вы хотите украсить атрибутами. Допустим, это автоматически сгенерированный класс:
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 является ключом. Затем я бы создал частичный класс в другом файле, например:
[Table("UserProfile")] [MetadataType(typeof(UserProfileMetadata))] public partial class UserProfile { internal sealed class UserProfileMetadata { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } } }
источник
MetadataType
атрибуту. Отлично сработано!UserProfile
?MetadataType
не существует в .NET CoreModelMetadataType
Это мой ответ:
разные файлы классов, или вы можете объединить метаданные в одном файле, но сохранить пространство имен одинаковым ... чтобы они могли видеть друг друга, очевидно.
имейте в виду, что при обновлении модели, например при добавлении дополнительных столбцов, вам также необходимо обновить класс проекта.
--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 { }
источник
Вам нужно определить частичный класс для своего
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; } }
источник
Не как таковое; компилятор будет жаловаться на то, что член определен в нескольких частях. Однако, поскольку использование настраиваемых атрибутов по своей природе является отражающим, вы можете определить класс «метаданных» и использовать его для содержания декораторов.
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();
источник