Введение общих типов в конструктор, наследующий от неуниверсального класса - PullRequest
0 голосов
/ 11 февраля 2019

Вопрос:

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


Объяснение:

Я создаю новый пользовательский атрибут, унаследованный от класса ValidationAttribute.Я хочу использовать универсальные типы в конструкторе, как показано ниже:

DateValidationAttribute : ValidationAttribute {

   public void DateValidationAttribute <TData>(Expression<Func<TData, DateTime?>> property){ ... }

}

Однако это, по-видимому, недопустимо, поскольку универсальные типы TData и TProperty не распознаются как универсальные.Кроме того, я не могу определить обобщенные элементы в определении класса, поскольку они наследуются от класса ValidationAttribute.Ошибка, которую я получаю, состоит в том, что TData и TProperty не определены.


Цель:

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

Current:

public DateTime? ToDate { get; set; }

[DateValidation("ToDate")]
public DateTime? FromDate { get; set; }

Goal:

public DateTime? ToDate { get; set; }

[DateValidation(prop => prop.ToDate)]
public DateTime? FromDate { get; set; }    

1 Ответ

0 голосов
/ 11 февраля 2019

Неподдержка обобщений в атрибутах - это наименьшая из ваших проблем.Атрибуты могут иметь только определенное подмножество типов (примитивы, перечисления, String, Type и одномерные массивы) в качестве аргументов конструктора , но не лямбда-выражения.Поэтому, даже если бы вы могли использовать непатентованные средства, вы не могли бы делать то, что пытались сделать.

Рассмотрите возможность использования строки в качестве параметра конструктора и использования nameof(), например:

[DateValidation(nameof(ToDate))]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...