Создать метод Generi c для нескольких похожих классов - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь провести рефакторинг некоторого кода, и в настоящее время мы не используем AutoMapper или какой-либо инструмент отображения.

Как бы я создал обобщенный c метод для нижеприведенного?

I около 8 разных моделей ViewModels передают похожие данные.

    public static AppUser Create(RegisterViewModel model)
    {
        return new AppUser()
        {
            FirstName = model.FirstName,
            LastName = model.LastName,
            Email = model.Email,              
        };
    }

    public static AppUser Create(TeamUserViewModel model)
    {
        return new AppUser()
        {
            FirstName = model.FirstName,
            LastName = model.LastName,
            Email = model.Email,
        };
    }

Я думал что-то вроде:

    public static AppUser Create<T>(T Model)
    {
    }

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Да, вы могли бы сделать что-то подобное. Проблема в том, что вы не сможете получить доступ к переменным FirstName, LastName или Email. Что вы должны сделать, это создать класс, подобный следующему

public class BaseClass
{
   public string FirstName;
   public string LastName;
   public string Email;
}

Теперь пусть ваши RegisterViewModel и TeamUserViewModel расширяют этот класс следующим образом:

public class RegisterViewModel : BaseClass
{
   // specialized information here
}

Теперь в вашей новой функции Вы можете указать тип T, например,

public static AppUser Create<T>(T model) where T : BaseClass
{
   // Stuff here
}

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

Кроме того, если вы хотите выполнить специализированные логи c для каждой модели, вы можете сделать следующее:

if(typeof(T) == typeof(TeamUserViewModel))
{
   // Perform action
}
else if (typeof(T) == typeof(RegisterViewModel))
{
   // Perform different action
}
0 голосов
/ 30 апреля 2020

Вы можете сделать следующее:

  • Создать базовый класс, от которого унаследована ваша модель представления, который содержит FirstName, LastName, Email. Используйте базовый класс в своем параметре для метода Create: public static AppUser Create(BaseViewModelBaseClass model)
  • Создайте интерфейс с именем IUserDetails, который реализует ваша модель представления, и задайте в качестве параметра public static AppUser Create(IUserDetailsViewModel Model)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...