Подтвердить что ты не робот

Могу ли я определять свойства в частичных классах, а затем отмечать их атрибутами в другом частичном классе?

Есть ли способ создать сгенерированный файл кода следующим образом:

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

а затем в другом файле:

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

Итак, у меня может быть класс, сгенерированный из базы данных, а затем использовать не созданный файл, чтобы его пометить?

4b9b3361

Ответ 1

Я видел что-то вроде этого, сделанное в статье Скотта Гатри (ближе к концу) - не пробовал это сам. 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; }
}

Ответ 2

Я знаю, что это старый вопрос, но вот решение, которое я использовал для таких случаев. Это полезно, когда у вас есть автоматически сгенерированные классы, которые вы хотите украсить атрибутами. Пусть говорят, что это автоматически сгенерированный класс:

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

Ответ 3

Это мой ответ
разные файлы классов или вы можете комбинировать метаданные в одном файле, но сохраняйте пространство имен одинаковым, так что они могут видеть друг друга, очевидно.

помните, когда вы обновляете свою модель, например, добавляете больше столбцов, вам также нужно обновить класс проекта.

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

Ответ 4

Не как таковой; компилятор будет жаловаться, что элемент определен в нескольких частях. Однако, поскольку использование пользовательских атрибутов является отражающим по своей природе, вы можете определить класс "метаданные" и использовать его для размещения декораторов.

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

Ответ 5

Вам нужно определить частичный класс для вашего класса 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; }
}