2014-12-27 2 views
0

멤버 식을 받아들이고 컴파일러에서 식의 혼합 속성 형식을 허용하지 않는 params 메서드를 작성했습니다. 여기혼합 된 속성 형식을 사용하는 멤버 식을 사용하는 C# 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에서 컴파일러가 생성하는,하지만, 그 배열은 MyMethods의 과부하의 제비를 가진 PARAMS 키워드를 교체하고 증가시키지 않고, Expression<Func<TEntity,TProp>>
이 해결 될 수있는 타입이다 매개 변수 목록? 단일 TProp을하지 않는 것으로

+1

:

  • 은 실제 회원을 얻을 수있는 다음 코드를 추가? 'TProp'을'object'로 대체 할 수 있습니까? –

  • +1

    메서드 서명과 예제 코드는 호환되지 않습니다. 컴파일 가능한 예제가 있다면 도움이 될 것입니다. – nvoigt

    +0

    대답은 다음과 같습니다. 당신이 제공하는 아이템에서 제네릭 타입이 다를 것이라고 기대할 때'params'로 작동하게 만들 수 없습니다. – MarcinJuraszek

    답변

    1
    1. Expression<Func<TEntity, object>>에 매개 변수 유형을 변경

      . 정확히 '할 MyMethod` 무엇

      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; 
      } 
      
    +0

    감사합니다, TProp 개체로 대체하고 MemberExpression 액세스하려면 코드를 추가하고 지금 나처럼 작동합니다. 그것을 원했다;) –

    1

    , 당신은뿐만 아니라 object로 교체하고 제네릭이 아닌 만들 수 있습니다

    public MyMethod<TEntity> Column(params Expression<Func<TEntity, object>>[] expressions) 
    
    +2

    예, 컴파일됩니다. 그러나 '표현식'에 싸여있는 델리게이트의 실제 유형을 확인하기 위해 리플렉션을 사용해야하므로 매우 유용 할 것입니다. – MarcinJuraszek

    +0

    고맙습니다. TProp을 해결 된 개체로 교체하십시오. –

    +0

    아프, TProp 대체하는 개체로 컴파일 할 수 있지만식이 더 이상 OG 형식의 MemberExpression, 필요합니다 ... –