2010-06-28 2 views
3

У меня есть следующий класс:Проблема с методом, который принимает 2 лямбды

public class MyClass<T> where T : class 
    { 
     public void Method1<TResult>(T obj, Expression<Func<T, TResult>> expression) 
     { 
      //Do some work here... 
     } 

     public void Method2<TResult>(T obj, Expression<Func<T, TResult>> expression1, Expression<Func<T, TResult>> expression2) 
     { 
      //Do some work here... 
     } 
    } 

я могу назвать method1 так:

MyClass<SomeOtherClass> myObject = new MyClass<SomeOtherClass>(); 

myObject.Method1(someObject, x => x.SomeProperty); 

Но когда я пытаюсь вызвать method2:

MyClass<SomeOtherClass> myObject = new MyClass<SomeOtherClass>(); 

myObject.Method2(someObject, x => x.SomeProperty, x => x.SomeOtherProperty); 

Я получаю следующую ошибку во время компиляции:

Error 1 The type arguments for method 'MyClass.Method2<SomeOtherClass>.Method2<TResult>(SomeOtherClass obj, System.Linq.Expressions.Expression<System.Func<SomeOtherClass,TResult>>, System.Linq.Expressions.Expression<System.Func<SomeOtherClass,TResult>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 

Как я могу сделать метод, который принимает два лямбда и называть его, как я предполагал?

+0

Являются x.SomeProperty и x => x.SomeOtherProperty того же типа? – miensol

ответ

7

У SomeProperty и SomeOtherProperty имеют одинаковый тип? Если нет, это ваша проблема, поскольку вы используете один параметр типа TResult.

Решение просто использовать два параметра типа:

public void Method2<TResult1, TResult2>(T obj, Expression<Func<T, TResult1>> expression1, Expression<Func<T, TResult2>> expression2) 
{ 
    //Do some work here... 
} 
4

Вы пробовали использовать 2 типа параметров?

Например:

void Method2<TResult1, TResult2>(T obj, 
    Expression<Func<T, TResult1>> expression1, 
    Expression<Func<T, TResult2>> expression2) 
0

Вы можете попробовать указать тип аргументов в явной форме.

myObject.Method2<string>(
    someObject, 
    x => x.SomeProperty, 
    x => x.SomeOtherProperty); 

Если это не работает (скажем, SomeProperty и SomeOtherProperty различные типы) можно разрешить дополнительную информацию о типе в объявлении метода.

public void Method2<TResult1, TResult2> 
(
    T obj, 
    Expression<Func<T, TResult1>> expression1, 
    Expression<Func<T, TResult2>> expression2 
) 
Смежные вопросы