Reputation: 57
Trying to create a generic class to be able to reduce redundancy in my c# code, I have 4 classes that more or less use the same methods (add, get, edit, delete) However when I am querying my db via entity framework I am getting this error. "cannot vert from 'T' to 'SneakerDrop.Domain.Models.User' and that 'T' does not contain properties of UserId
I have converted the class out of static, to be able to create a new instance in program, to test if it is because I am trying to pass a new datatype via xUnit.
public class Program
{
public User user = new User
{
UserId = 1,
Username = "ian2519",
Password = "Password",
Firstname = "Ian",
Lastname = "Nai",
Email = "[email protected]"
};
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;
}
}
getting error that T cannot convert from T on _db.USers.Add(user) and getting T does not contain definition for Username, Firstname, etc.. on lines results.Username, results.Firstname...
Upvotes: 0
Views: 41
Reputation: 81503
This class serves little purpose of being generic and would need to be constrained to something.
If you could make it generic you would need to constraint it to User
(since you have shown no interfaces or sub-classes) which would make any generic plumbing redundant. If you feel you need a helper class in this case, just use the standard types.
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;
}
}
Usage
UserHelper test = new UserHelper();
test.AddUser(program.user);
What it seems like you are trying to do is to make a generic repository over EF, which is just hiding useful methods behind a layer of abstraction, complicating a well written framework and making your development more problematic. I would advise against it strongly unless you have a very specific need.
Upvotes: 1