繁体   English   中英

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 的问题。 我认为您想要的是在表上使用此包装器以通过 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();
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM