我怎样才能使这个方法通用?我应该如何将 Stock_ID 反映到此方法中? 提前致谢
public class LocalSQL<T> where T : new()
{
public static async Task<List<T>> GETLAST( )
{
return await conn.Table<T>()
.OrderByDescending(x => x.Stock_ID)
.Take(10)
.ToListAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
泛型约束要求您为泛型类型指定接口或父类。尝试这个
public interface IStock
{
long Stock_ID { get; set; }
}
public class LocalSQL<T> where T : IStock, new()
{
public static async Task<List<T>> GETLAST( )
{
return await conn.Table<T>()
.OrderByDescending(x => x.Stock_ID)
.Take(10)
.ToListAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
public class LocalSQL<T> where T : new()
{
public static async Task<List<T>> GETLAST(Expression<Func<T, TKey>> key)
{
return await conn.Table<T>()
.OrderByDescending(key)
.Take(10)
.ToListAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
这样您就可以在您的方法中仅指定要订购的 id。
获取(x => x.StockId)
这回答了您在调用方法时如何传递 id 的问题。我认为您想要的是在表上使用此包装器以按 id 获取内容,但是您的表具有不同的名称 id,因此您不能只制作一个“IStock”接口。
但是使用它,您可以拥有一个返回该表达式的接口,并使您的表实现该接口。这样你就有了一个通用接口、通用实现,并且表可以给你不同命名的 id。
尝试实施,是这样的:
public class StockTable : IWithId<StockTable>
{
public long Stock_Id { get; set; }
public Expression<Func<StockTable, long>> IdExpression => x => x.Stock_Id;
}
public interface IWithId<T>
{
Expression<Func<T, long>> IdExpression { get; }
}
public class LocalSQL<T> where T : IWithId<T>, new()
{
public static async Task<List<T>> GETLAST()
{
var obj = new T();
return await conn.Table<T>()
.OrderByDescending(obj.IdExpression)
.Take(10)
.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
感觉有点尴尬,但我认为这样的事情应该可行。您可以尝试一些不同的方法,例如,如果您控制如何创建 LocalSQL(如通过工厂而不是直接在代码中),您可以在那里拥有正确构建 LocalSQL 对象的逻辑,并为其提供正确的表达式(您有一个类型映射到表达式的字典),这样就没有接口,您可以从静态上下文访问它而无需启动对象,并且所有特定于 LocalSQL 和表映射的逻辑都将在 LocalSQL 工厂中。
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |