我可以在方法签名中动态选择 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<>
中的通用参数预先填充字典属性 名字。
我有一个自定义 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 returnsPluralize(typeof(T).Name)
. - 通过反射迭代派生的
DBContext
,取出所有DBSet<>
属性并使用DBSet<>
中的通用参数预先填充字典属性 名字。