Как определить тип заголовка внутри универсального класса или задать имя класса в качестве переменной?

#c# #blazor #blazor-server-side

#c# #blazor #blazor-на стороне сервера

Вопрос:

Как я могу создать переменную класса (или псевдоним класса) поверх файла и использовать это имя переменной позже в файле? Моя цель — повторно использовать (скопировать) этот класс в нескольких местах и изменить только переменную типа класса поверх файла. В противном случае, каждый раз, когда я копирую этот класс, мне приходится заменять все имена классов в файле, который составляет более тысячи строк. Иногда вы просто пропускаете некоторые из них. Конечно, не все классы имеют одинаковые свойства, и когда я изменю имя класса с Address на Employee, VS editor выделит эти части —

«Сотрудник не содержит члена с именем ‘StreetNo'»

Тогда я позабочусь об этих красных волнистых линиях.

Возможно ли это? Например:

 var model = Employee;  // Employee is a class
 

и ниже используйте его следующим образом:

 model newInstance = new model();
 

Я пытался использовать generics (TItem), но я не могу назначить тип заголовка внутри универсального класса:

 public class Foo<TItem> where TItem : Employee
{
    // where TItem : Employee - this part of code only sets constraint, but doesn't set TItem equal to Employee - (e.g. TItem = Employee)
}
 

Это очень простой пример компонента razor, который на самом деле является частичным классом. Я просто упростил дело. Есть идеи?

Комментарии:

1. Почему бы просто не использовать find / replace, если вы уже используете повторное копирование / вставку? Не могли бы вы реорганизовать код, чтобы уменьшить количество дублирования?

2. Я чувствую, что вы неправильно истолковали, с кем работают дженерики. Ограничение where TItem : Employee делает все, что вам нужно. Использование псевдонима помогает вам в сценариях копирования-вставки, но generics обычно помогает вам вообще избежать копирования и вставки кода. Когда разработчик не может поддерживать инициализацию универсального типа, вы наследуете его от универсального класса с вашей типизированной реализацией, но дженерики будут работать в Blazor с правильным синтаксисом, поэтому покажите сценарий, в котором Generic не работал, чтобы мы могли показать вам правильное решение.

3. Вам нужно начать с нуля: почему вы копируете-вставляете в первую очередь?

Ответ №1:

Вы можете попробовать using псевдонимы:

 using Model = Employee;
 

И далее в коде:

 Model newInstance = new Model();