我有一个自定义类Customer,在另一个类中有一个方法,该方法返回一个基于LiteDB的LiteCollection的列表,该列表使用签名中的Customer类进行类型化。我想知道的是,是否有可能创建一个动态选择使用哪种类型的类的方法,这意味着如果我可以将调用该方法时要返回的LiteCollection的类类型作为参数进行传递。
代码如下:
public static LiteCollection<Customer> GetCustomers()
{
var collection = ConnectToDB().GetCollection<Customer>("customers");
return collection;
}
答案 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<>
中的泛型参数和该属性来将字典预填充为第一种可能性名称。