2013-09-06 1 views
1

다음과 같은 방법으로 일반화하는데 어려움이 있습니다.일반 메소드 일반화하기

private void AddCheckBox(CheckBox cb, Expression<Func<ISomeInterface, bool>> func) 
{ 
    var memRef = MemberReference.Create(mSomeInterfaceAttribute, func); 
    ....... 
} 

MemberReference.Create에 대한 정의는 다음과 같습니다

private void AddCheckBox<T>(CheckBox cb, Expression<Func<T, bool>> func) 
{ 
    var memRef = MemberReference.Create<T, bool>(mSomeInterfaceAttribute, func); 
    ...... 
} 

내가 무엇입니까 잘못된 인수 오류 :

public static MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class; 

이것은 내가 뭘하려

오류 2 인수 2 : 'System.Linq.Expressions.Expres'에서 변환 할 수 없습니다. 시온> '에서'System.Linq.Expressions.Expression> '

오류에 가장 적합한 오버로드 된 메서드에 매치 한'MemberReference.Create (ISomeInterafce, System.Linq.Expressions.Expression이>) '일부 잘못된 인수가

+1

그리고 무엇을 작동하지 않았다? 컴파일러 오류? –

+0

죄송합니다, 나는 K가 요구 클래스가 오류 – Kobe

+1

유효하지 않은 인수를 얻고, 질문을 업데이트 한 때문에 T해야 너무'개인 무효 AddCheckBox (CheckBox 구성 CB, 표현 > FUNC) 여기서 T : class' –

답변

3

을 할 수 있도록 당신이 할 필요가 정의의 끝과 Create에 대한 호출에 as T에서

private void AddCheckBox<T>(CheckBox cb, Expression<Func<T, bool>> func) where T : class 
{ 
    var memRef = MemberReference.Create<T, bool>(mSomeInterfaceAttribute as T, func); 
    (....) 
} 

참고 where T : class에 일반적인 정의를 변경하는 것입니다 생각 .

+0

이 정의에서 같은 오류가 발생했습니다. – Kobe

+0

@vBx – Shaamaan

+0

그래, 작동하지만, T 대신에 인터페이스 대신 인터페이스를 사용하고 싶습니다. if (T is Interface1) Craete (m은 Interafce1) else if (T는 Interface2) (Interface2로 m)을 만듭니다. 나는 처음부터 이것을 언급하지 않으려 고 분명하고 유감스럽게 생각한다. – Kobe

2

당신의 정의를 살펴보면

MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class 

첫째가 K이 클래스 요구 사항은, 그래서 이것은 당신의 addcheckbox 방법도 선언해야 함을 의미합니다 T : class

두 번째로 mSomeInterfaceAttribute의 출처는 T 유형으로 정의해야합니다.

이것을 클래스 필드로 선언했다고 가정하면 메서드 제네릭이 아닌 클래스를 만들어야합니다.

예 :

추가 그런 다음 유추 할 수 있으므로 MemberReference.Create에 형식 매개 변수를 지정할 필요가 없습니다. 그냥

class MyClass<T> where T: class 
{ 

    private T mSomeInterfaceAttribute; 

    private void AddCheckBox(CheckBox cb, Expression<Func<T, bool>> func) 
    { 
     var memRef = MemberReference.Create(mSomeInterfaceAttribute, func); 
     ...... 
    } 
} 
+0

메서드를 this로 변경했습니다. private void AddCheckBox (CheckBox cb, Expression > func) 여기서 T : class. 여전히 동일한 오류가 발생합니다 – Kobe

+0

@vBx 답변을 업데이트했지만 'mSomeInterfaceAttribute'가 어디에서 왔는지 설명해야합니다. –

1

을 감안할 때이 :

public class MemberReference<K, M> 
{ 
    public static MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class 
    { 
     return null; 
    } 
} 

는 다음 작업 갈까요 :

private static void AddCheckBox<T>(CheckBox cb, Expression<Func<T, bool>> func) where T : class 
{ 
    var Tvar = (T) mSomeInterfaceAttribute; // Hopefully it is of this type, make that sure 
    var memRef = MemberReference<T, bool>.Create(Tvar, func); 
} 
관련 문제