我有以下使用C# 6的泛型类:
public class IncludeMapper<T1> {
private readonly Dictionary<String, List<LambdaExpression>> _properties = new Dictionary<String, List<LambdaExpression>>();
public IncludeMapper<T1> Add<T2, T3>(String property, Expression<Func<T1, T2>> path1, Expression<Func<T2, T3>> path2) {
if (!_properties.ContainsKey(property))
_properties.Add(property, new List<LambdaExpression> { path1, path2 });
return this;
}
public IncludeMapper<T1> Add<T2, T3, T4>(String property, Expression<Func<T1, T2>> path1, Expression<Func<T2, T3>> path2, Expression<Func<T3, T4>> path3) {
if (!_properties.ContainsKey(property))
_properties.Add(property, new List<LambdaExpression> { path1, path2, path3 });
return this;
}
}Add方法有几个表达式(路径),它们只包含一个Ti和Ti+1。
有办法简化我的代码吗?在路径7之前,我至少还需要4种类似的方法。
发布于 2016-07-06 09:19:05
有办法简化我的代码吗?
好吧,你可以简化一下
public class IncludeMapper<T1> {
private readonly Dictionary<String, List<LambdaExpression>> _properties =
new Dictionary<String, List<LambdaExpression>>();
private IncludeMapper<T1> AddImpl(
string property,
params LambdaExpression[] expressions)
{
if (!_properties.ContainsKey(property))
{
_properties.Add(property, paths.ToList());
}
return this;
}
public IncludeMapper<T1> Add<T2, T3>(
String property,
Expression<Func<T1, T2>> path1,
Expression<Func<T2, T3>> path2) =>
AddImpl(path1, path2);
public IncludeMapper<T1> Add<T2, T3, T4>(
String property,
Expression<Func<T1, T2>> path1,
Expression<Func<T2, T3>> path2,
Expression<Func<T3, T4>> path3) =>
AddImpl(path1, path2, path3);
...
}对于想要支持的“泛型性”,您仍然需要另一个方法,但至少实现是微不足道的。
当然,如果您希望能够指定多个路径,但每个路径必须是相同类型的,这很容易-因为这样您就可以使用params来处理单个类型的参数。但是,如果您想要使用lambda表达式作为参数,那么该参数必须是特定的Expression<TDelegate>类型,而且您似乎希望能够改变所涉及的类型。
https://stackoverflow.com/questions/38220293
复制相似问题