无法将泛型类型从类的新实例传递到类方法中

时间:2019-02-05 02:29:41

标签: c# entity-framework unit-testing generics

尝试创建一个通用类以减少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无法从_db.USers.Add(用户)上的T转换 并且获取T不包含用户名,名字等的定义。 在结果行上。用户名,结果。名字...

1 个答案:

答案 0 :(得分:1)

该类几乎没有通用的目的,需要将其限制在某种范围内。

如果您可以将其设为通用,则需要将其限制为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上建立通用存储库,这只是将有用的方法隐藏在抽象层后面,使编写良好的框架复杂化,并使您的开发遇到更多问题。除非您有非常具体的需求,否则我强烈建议您这样做。