2016-07-06 3 views
1

У меня есть следующий общий класс, используя C# 6:Общий метод с Ti и Ti + 1

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.

Есть ли способ упростить мой код? Мне понадобится как минимум еще 4 метода до тех пор, пока не будет достигнут путь 7.

+2

Короткий ответ: Нет. Расширенный ответ: [здесь] (http://stackoverflow.com/questions/15417174/using-the-params-keyword-for-generic-parameters-in-c-sharp) – lokusking

ответ

4

Есть ли способ упростить мой код?

Ну, вы могли бы упростить ему немного:

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 с одного типа параметра. Но параметр должен быть конкретным типом Expression<TDelegate>, если вы хотите использовать выражение лямбда в качестве аргумента, и похоже, что вы хотите иметь возможность изменять типы.

Смежные вопросы