Метод C# params с использованием выражений-членов со смешанными типами свойств

Я написал метод params, который принимает выражения-члены, и заметил, что компилятор не будет принимать смешанные типы свойств из выражений. Вот мой код

public class MyClass<TEntity>
{
  public MyMethod<TEntity> Column<TProp>(params Expression<Func<TEntity, TProp>>[] expressions)
  { ... }
}

public class Customer
{
  property int Id {get; set;}
  property string Name {get; set;}
  property int Age {get; set;}
}

var mc = new MyClass<Customer>();
mc.MyMethod(c=>c.Id, c=>c.Age); // Works fine, using 2 int types
mc.MyMethod(c=>c.Id, c=>c.Name); // Results into a compile error, using int and string type mixed

Я знаю, что компилятор создает из ключевых слов params массив, но этот массив имеет тип Expression<Func<TEntity,TProp>>
Можно ли это решить, не заменяя ключевое слово params множеством перегрузок MyMethods и увеличивая список параметров?

2 ответа

Решение
  1. Измените ваш тип параметра на Expression<Func<TEntity, object>>,

  2. Добавьте следующий код, чтобы получить фактических членов:

    public void MyMethod(params Expression<Func<TEntity, object>>[] expressions)
    {
        var members = from expression in expressions
                        let cast = expression.Body as UnaryExpression
                        let member = (expression.Body as MemberExpression)
                                    ?? cast.Operand as MemberExpression
                        where member != null
                        select member.Member;
    }
    

Поскольку у вас, кажется, нет ни одного TPropВы можете также заменить его на object и сделать его необщим:

public MyMethod<TEntity> Column(params Expression<Func<TEntity, object>>[] expressions)
Другие вопросы по тегам