не может передать универсальный тип из нового экземпляра класса в метод класса - PullRequest
0 голосов
/ 05 февраля 2019

Пытаясь создать универсальный класс, чтобы иметь возможность уменьшить избыточность в моем коде на c #, у меня есть 4 класса, которые более или менее используют одни и те же методы (добавление, получение, редактирование, удаление). Однако, когда я запрашиваю свою базу данных через сущностьрамки я получаю эту ошибку."невозможно перевести из 'T' в 'SneakerDrop.Domain.Models.User', и что 'T' не содержит свойств UserId

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

public class Program
{
    public User user = new User
    {
        UserId = 1,
        Username = "ian2519",
        Password = "Password",
        Firstname = "Ian",
        Lastname = "Nai",
        Email = "Email@email.com"
    };

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();

        UserHelper<User> test = new UserHelper<User>();
        Program program = new Program();

        test.AddUser(program.user);
    }




public class UserHelper<T>
{
 private SneakerDropDbContext _db = new SneakerDropDbContext();

    public bool AddUser(T user)
    {
        _db.Users.Add(user);
        return _db.SaveChanges() == 1;

    }
    public T GetUserInfoById(T user)
    {
        T dbInfo = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();

        return dbInfo;
    }
    public bool EditUserInfoById(T user)
    {
        var results = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();

        results.Username = user.Username;
        results.Firstname = user.Firstname;
        results.Lastname = user.Lastname;
        results.Password = user.Password;
        results.Email = user.Email;

        _db.SaveChanges();

        return true;
    }
}

получая ошибку, что T не может преобразовать из T на _db.USers.Add (user) и получая Tне содержит определения имени пользователя, имени и т. д. в строках results.Username, results.Firstname ...

1 Ответ

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

Этот класс не имеет смысла быть универсальным и должен быть ограничен чем-то.

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

public class UserHelper
{

   public bool AddUser(User user)
   {
      _db.Users.Add(user);
      return _db.SaveChanges() == 1;

   }
   public User GetUserInfoById(User user)
   {
      User dbInfo = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();

      return dbInfo;
   }
   public bool EditUserInfoById(User user)
   {
      var results = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();

      results.Username = user.Username;
      results.Firstname = user.Firstname;
      results.Lastname = user.Lastname;
      results.Password = user.Password;
      results.Email = user.Email;

      _db.SaveChanges();

      return true;
   }
}

Использование

UserHelper test = new UserHelper();
test.AddUser(program.user);

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

...