我可以在方法签名中动态选择 LiteCollection<T> 的类型吗?

Can I dynamically choose the type of a LiteCollection<T> in a method signature?

我有一个自定义 class 客户,在另一个 class 中有一个方法,该方法 return 是一个基于 LiteDB 中的 LiteCollection 的列表,使用客户 class 在签名。我想知道的是,是否可以创建一个动态选择 class 使用类型的方法,这意味着如果我可以将 LiteCollection 的 class 类型作为参数传递给 return 时我调用方法。

代码如下:

public static LiteCollection<Customer> GetCustomers()
        {
            var collection = ConnectToDB().GetCollection<Customer>("customers");

            return collection;
        }

怎么样:

public static LiteCollection<T> Get(string tableName)
{
    return ConnectToDB().GetCollection<T>(tableName);
}

那将被称为:

var table = Get<Customer>("customers");

更新

不幸的是,实际上不可能摆脱通用类型,否则您的消费代码不知道它会返回什么。所以可能的最小值是

var table = Get<Customer>();

在那种情况下,您的实现需要某种从类型到 table 名称的映射器。为此,我可以想到三种可能性(您也可以组合):

  • class 有一个内部 Dictionary<Type, string>,其中手动输入给定类型的所有 table 名称。
  • 惯例是,对于每个 T,table 名称是类型名称的复数字符串,那么您需要 pluralize method returns Pluralize(typeof(T).Name).
  • 通过反射迭代派生的 DBContext,取出所有 DBSet<> 属性并使用 DBSet<> 中的通用参数预先填充字典属性 名字。