2017-02-12 3 views
0

왼쪽 객체에 func (또는 비슷한 방법)을 적용 할 방법이 있는지 알아 내려고합니다. 예 :C# func <> 왼쪽 객체에 적용

member1.MyFunction() 

다음은 간단한 사용 방법입니다. 클래스 B의 목록과 클래스 B의 요소를 요약하는 메소드가 포함 된 ClassA를 얻었습니다. 그리고 classB는 double 형의 memberX와 memberY라는 두 개의 속성을 가지고 있습니다. 이 기능은 우리가 합치는 ClassB의 회원을 선택하는 데 사용됩니다.

CS1061의 C 번호가에 대한 정의와의 첫 번째 인수를 받아들이는없는 확장 메서드를 포함하지 않습니다

가 나는 오류가

theSum += TheList[i].TheFunction(); 

쓰기 라인에 오류가있어 유형을 찾을 수 있습니다 (사용 지시문 또는 어셈블리 참조가 누락 되었습니까?)

해결 방법을 알고 있습니까? 내 연구는 제네릭 기능의 왼쪽에 적용되는 모든 것을 이끌어 낼 수 없었습니다.

public class ClassA 
{ 
    public List<ClassB> TheList; 
    public ClassA() 
    { 
     ClassB m1 = new ClassB(1, 2); 
     ClassB m2 = new ClassB(1, 2); 
     ClassB m3 = new ClassB(1, 2); 
     TheList= new List<ClassB>() { m1, m2, m3 }; 
    } 
    private double CalculateSum(Func<double> TheFunction) 
    { 
     double theSum = 0; 
     for (int i = 0; i < TheList.Count(); i++) 
     { 
      theSum += TheList[i].TheFunction(); 
      // I'd like to use the previous line instead of having to write 
      // a function for both of the following. 
      // theSum += TheList[i].GetMember1(); 
      // theSum += TheList[i].GetMember2(); 
     } 
     return theSum; 
    } 
} 
public class ClassB 
{ 
    private double memberX; 
    private double memberY; 
    public ClassB(double x, double y) 
    { 
     memberX = x; 
     memberY = y; 
    } 

    public double GetMember1() { return memberX; } 
    public double GetMember2() { return memberY; } 
} 

답변

1

당신은 이런 식으로 뭔가를 시도 할 수 :

private double calculateSum(Func<ClassB, double> aFunction) 
{ 
    double theSum = 0; 
    for (int i = 0; i < aList.Count(); i++) 
    { 
     theSum += aFunction(aList[i]); 
    } 

    return theSum; 
} 

업데이트

당신이 정말 그 왼쪽에있는 객체에 FUNC을 적용 할 경우에, 당신은 확장 메서드를 정의 할 수 있습니다.

public static class ClassBExtensions 
{ 
    public static double Sum(this ClassB arg, Func<ClassB, double> func) 
    { 
     return func(arg); 
    } 
} 

그럼 내가 제대로 이해하면, 당신은 그것의 값 중 하나를 반환 ClassB "의"방법을 원하는이

Func<ClassB, double> func = null; // define your func here 
for (int i = 0; i < aList.Count(); i++) 
    { 
     theSum += aList[i].Sum(func); 
    } 
return theSum; 
+0

나는 그것을 피하려고했지만 답변 (및 검색 결과)을 볼 때 Func <> 또는 다른 유사한 방법을 사용하는 다른 방법이 없다고 생각합니다. –

+0

func을 왼쪽 객체에 적용하려면 내 업데이트를 참조하십시오. –

3

잘 확실히 그 구문,하지만 당신은 그냥 사용할 수 있습니다

theSum += aFunction(aList[i]); 

나는 당신이 이에 대한 확장 방법을 쓸 수도있을 것 같군요하지만 위의 더 관용적이다. 더 관용적 일 시작하는 LINQ를 것 사용 사실

, - 당신의 calculateSum 방법은 Sum로 LINQ에 이미 존재하는, 당신이 호출 할 수 있도록 : 물론

double sum = aList.Sum(x => x.getMember1()); 

을 더 관용구, 당신이 속성을 사용하십시오 대신 방법의 :

double sum = aList.Sum(x => Member1); 

또한 관용구를 들어, 당신은 당신이 어떤 방법는 대문자로 시작, 후속의 .NET 명명 규칙이 있는지 확인하십시오 것입니다. I 강력하게은 명명 규칙을 따르기를 권장합니다 (모조 데모 코드의 경우조차도).

+0

. 'Func '을 사용하면 OP에 다른 오류를 묻는 것 외에는 아무 것도하지 않을 것입니다. – Chris

+0

명명 규칙에 더 가까워 지도록 내 게시물을 편집했습니다. 도와 줘서 고마워. –

0

과 같이 호출.(ClassB 여부 이러한 방법 여부를해야한다 - 단순히 계산 실제로 ClassA에 속하는 등의 일부가 될 수 - 수있는 다른 질문을.)

당신이 ClassB을 변경할 수있는 경우, 단순히 거기에 추가 :

public class ClassB 
{ 
    private double memberX; 
    private double memberY; 
    public ClassB(double x, double y) 
    { 
     memberX = x; 
     memberY = y; 
    } 

    public double GetMember1() { return memberX; } 
    public double GetMember2() { return memberY; } 

    public double AFunction() 
    { 
     bool condition = ... 
     return condition ? memberX : memberY; 
    } 
} 

나는 if/else에 약간의 공간을 절약하려면 여기를 삼항 연산자 ?:을 사용하고 있습니다.

public static class ClassBExtensions 
{ 
    public double AFunction(this ClassB b) 
    { 
     bool condition = ... 
     return condition ? b.GetMember1() : b.GetMember2(); 
    } 
} 

이제 단순히 것처럼 유형 ClassB의 인스턴스에 .AFunction()를 호출 할 수 있습니다합니다 (CS1061 오류 메시지가 암시로) 당신이 하지 변화 ClassBextension methods 당신을 도움이 될 수 있다면 지금

메서드는 원래 거기에 선언되었습니다. 확장 메서드는 공개적으로 액세스 할 수있는 필드에만 액세스 할 수 있습니다.

또한에 ClassB 정의를 줄일 수 properties을 조사 할 수 있습니다 :이 대답은 정말 첫 번째 줄에 aFunction` '의 새로운 정의를 포함한다고 생각

public class ClassB 
{ 
    public ClassB(double x, double y) 
    { 
     MemberX = x; 
     MemberY = y; 
    } 

    public double Member1 { get; } 
    public double Member2 { get; } 

    /* 
    public double AFunction() 
    { 
     bool condition = ... 
     return condition ? Member1 : Member2; 
    } 
    */ 
} 
+0

필자는 제안 된대로 클래스 정의를 축소 할 것입니다. 확장 메서드의 존재를 알지 못했지만, 좋은 읽을 거리입니다. 클래스 B를 변경할 수 있기 때문에 제안이 나에게 도움이 될지 모르지만 여전히 단순화되지 않은 응용 프로그램에 가장 적합한 지 여부를 알아야합니다. –

관련 문제