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

时间:2018-11-29 08:00:55

标签: c# list litedb

我有一个自定义类Customer,在另一个类中有一个方法,该方法返回一个基于LiteDB的LiteCollection的列表,该列表使用签名中的Customer类进行类型化。我想知道的是,是否有可能创建一个动态选择使用哪种类型的类的方法,这意味着如果我可以将调用该方法时要返回的LiteCollection的类类型作为参数进行传递。

代码如下:

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

            return collection;
        }

1 个答案:

答案 0 :(得分:2)

怎么样:

table

那将被称为:

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

更新

不幸的是,实际上不可能摆脱泛型类型,因为否则您的消耗代码不知道它返回了什么。所以可能的最小值是

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

在这种情况下,您的实现需要从类型到表名的某种映射器。为此,我可以想到三种可能性(也可以将它们组合在一起):

  • 该类具有内部var table = Get<Customer>(); ,在其中手动输入给定类型的所有表名。
  • 惯例是,对于每个Dictionary<Type, string>,表名都是类型名称的复数字符串,那么您需要一个pluralize method并返回T
  • 通过反射,您可以对派生的Pluralize(typeof(T).Name)进行迭代,获取所有DBContext属性,并通过使用DBSet<>中的泛型参数和该属性来将字典预填充为第一种可能性名称。