C#如何制作泛型方法

C# how to make generic method

如何使此方法通用?我应该如何将 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();
    }
}

泛型约束要求您为泛型类型指定接口或父级 class。试试这个

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();
    }
}
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();
    }
}

这样您就可以在您的方法中仅指定要订购的 ID。

GETLAST(x => x.StockId)

这回答了您关于如何在调用方法时传递 id 的问题。 我想你想要的是让这个包装器覆盖 tables 以通过 id 获取东西但是你的 tables 有不同的命名 id's 所以你不能只制作一个 "IStock" 接口。

但是使用它,您可以拥有一个 returns 那个表达式的接口,并让您的 table 实现该接口。这样你就有了一个通用的接口,通用的实现,并且 tables 可以给你不同的命名 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();
    }
}

感觉有点别扭,不过我觉得这样的东西应该行得通。您可以尝试一些不同的方法,例如如果您控制 LocalSQL 的创建方式(如通过工厂而不是直接在代码中),您可以在那里拥有正确构建 LocalSQL 对象的逻辑,并为其提供正确的表达式(您有一个映射到表达式的类型字典),这样就没有接口,您可以从静态上下文访问它而无需启动对象,并且所有特定于 LocalSQL 和 table 映射的逻辑都将在 LocalSQL 工厂中。