首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ti和Ti+1通用方法

Ti和Ti+1通用方法
EN

Stack Overflow用户
提问于 2016-07-06 09:13:43
回答 1查看 103关注 0票数 1

我有以下使用C# 6的泛型类:

代码语言:javascript
复制
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种类似的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-06 09:19:05

有办法简化我的代码吗?

好吧,你可以简化一下

代码语言:javascript
复制
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>类型,而且您似乎希望能够改变所涉及的类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38220293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档