Метод 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 ответа
Решение
Измените ваш тип параметра на
Expression<Func<TEntity, object>>
,Добавьте следующий код, чтобы получить фактических членов:
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)