我正在编写一个用于解析存储过程结果集的小型库(基本上,非常具体的 ORM 类型)。
我有课
class ParserSetting<T> // T - type corresponding to particular resultset
{
...
public ParserSettings<TChild> IncludeList<TChild, TKey>(
Expression<Func<T, TChild[]>> listProp,
Func<T, TKey> foreignKey,
Func<TChild, TKey> primaryKey,
int resultSetIdx)
{ ... }
}
这里方法IncludeList
指定结果集编号。resultSetIdx
应该将其解析TChild
为由对象组成并分配给由listProp
表达式定义的属性(作为数组)。
我使用它如下:
class Parent
{
public int ParentId {get;set;}
...
public Child[] Children{get;set;}
}
class Child
{
public int ParentId {get;set;}
...
}
ParserSettings<Parent> parentSettings = ...;
parentSettings.IncludeList(p => p.Children, p=> p.ParentId, c => c.ParentId, 1);
这种方法很有魅力。到目前为止,一切都很好。
除了数组之外,我还想支持不同类型的集合。所以,我正在尝试添加以下方法:
public ParserSettings<TChild> IncludeList<TChild, TListChild, TKey>(
Expression<Func<T, TListChild>> listProp,
Func<T, TKey> foreignKey,
Func<TChild, TKey> primaryKey,
int resultSetIdx)
where TListChild: ICollection<TChild>, new()
{ ... }
但是,当我尝试按如下方式使用它时:
class Parent
{
public int ParentId {get;set;}
...
public List<Child> Children{get;set;}
}
class Child
{
public int ParentId {get;set;}
...
}
ParserSettings<Parent> parentSettings = ...;
parentSettings.IncludeList(p => p.Children, p=> p.ParentId, c => c.ParentId, 1);
C# 编译器发出错误消息“无法推断方法 ParserSettings.IncludeList(...) 的类型参数”。
如果我明确指定类型,它会起作用:
parentSettings.IncludeList<Child, List<Child>, int>(
p => p.Children, p=> p.ParentId, c => c.ParentId, 1);
但这有点违背了使调用过于复杂的目的。
有没有办法实现这种场景的类型推断?