我有一个使用sqlite(sqlite-pcl-net)建立数据库连接的应用程序(xamarin)。我已经编写了使用特定类从数据库检索数据的方法。但是我对如何使用泛型编写这些内容感兴趣?
我要使用的泛型方法如下:(导致User类)
public Task<User> GetUserByIdAsync(int id)
{
return Database.Table<User>().Where(i => i.Id == id).FirstOrDefault();
}
现在,我需要具有相同的值,从而产生一个T类,但id保持不变(function参数保持一个int值)。有人可以帮我弄这个吗?
正如@vc 74在注释部分中指出的那样,您可以实现公共接口或从具有Id
属性的基类继承:
public Task<T> GetUserByIdAsync<T>(int id) where T : BaseEntity
{
return Database.Table<T>().Where(i => i.Id == id).FirstOrDefault();
}
public class User : BaseEntity
{
public int Id {get; set;}
}
或者您可以使用Expression Builder:
public static IQueryable<T> WhereByField<T>(this IQueryable<T> q, string filterField)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, filterField);
var exp = Expression.Lambda(prop, param);
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable), "where", types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
此扩展方法的实现类似于Database.Table<User>().WhereByField("Id");
:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句