Как извлечь и скопировать аннотации данных из одного класса в другой (набор свойств) - PullRequest
2 голосов
/ 20 марта 2012

У меня проблема с отражением, DataAnnotations и asp.mvc.

Я определил интерфейс, например:

public interface IFoo
{
    string Name { get; set; }
}

Затем я создаю классы, которые реализуют этот интерфейс И добавляет некоторыебольше свойств:

public class a : IFoo
{
    public string Name { get; set; }

    [MaxLength(50)]
    public string P1 { get; set; }
}

public class b: IFoo
{
    public string Name { get; set; }

    [Required]
    [MaxLength(100)]
    public string P2 { get; set; }
}

// Дополнительный класс, который должен хранить извлеченные свойства из класса a или b.

public class AdditionalProperty
{
    public string Name { get; set }

    public string Value { get; set }
}

Как вы можете видеть, есть некоторые дополнительныесвойства с атрибутами DataAnnotations.

Итак, вопрос в том, как создать коллекцию дополнительных свойств с метаданными DataAnnotations?.

Ожидается следующий результат:

Для класса a => ICollection = {{Name = "P1", Value = null}} // НО свойство Value должно иметь аннотации Data из свойства P1.

Для класса b => ICollection = {{Name= "P2", Value = null}} // НО свойство Value должно иметь DataAnnotations из свойства P2.

Требуется создать модель в asp.mvc с проверкой, например:

public class aspMvcModel
{
    public ICollection<AdditionalProperty> ListOfProperties { get; set; }
}

Тогда я могу использовать этоКласс модели для отображения формы в представлении asp.mvc.

-

Я знаю, как извлечь список свойств, и я знаю, как выбирать только уникальные свойства для каждого класса (упрощенный код):

var classToScan = new a();
var properties = classToScan.GetType().GetProperties()

Но я не знаю, как "скопировать" аннотации данных из одного класса в коллекцию класса AdditionalProperty.

Есть идеи?.

1 Ответ

0 голосов
/ 26 апреля 2012

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

var metaData = ModelMetadataProviders.Current.GetMetadataForType(null, Type.GetType("namespace.a"));
            IDictionary<string, object> validationAttributes = helper.GetUnobtrusiveValidationAttributes("P1", metaData);
...