2013-04-03 6 views
0

여기에 불완전하고 깨진 예제가 있습니다. 모델과 속성을 고려한 다른 함수에 함수를 전달할 수 있는지 알고 싶었습니까? 내 뜻을 아래의 예문에 적어주십시오.함수를 다른 모델로 호출하기 위해 C#의 다른 함수에 전달하기

private void ValidateSurvey(Survey survey) 
{ 
    // lines 1 to 10, or 1 to 8 or 11 to 16, etc 
    for (var i = survey.FirstLine; i <= survey.LastLine; i++) 
    { 
     IsAnswerValid(survey, "1.1.1", i, /* some rules to apply here i.e. [TModel] != null && [TModel].Value == "foo" */) 
    } 

} 

private bool IsAnswerValid<TAnswer>(
    Survey survey, 
    string rowName, 
    int lineNumber, 
    Func<TAnswer, bool> answerValueValidator 
) where TAnswer : Answer 
{ 
    if (survey == null) 
     throw new ArgumentNullException("survey"); 
    if (answerValueValidator == null) 
     throw new ArgumentNullException("answerValueValidator"); 
    if (string.IsNullOrWhiteSpace(rowName)) 
     throw new ArgumentNullException("Null/blank rowName specified"); 
    if(lineNumber < 0) 
     throw new ArgumentOutOfRangeException("lineNumber must be positive"); 

    // get answer list for the required row 
    var answerList = survey.Rows 
     .Where(
      r => r.Name.Trim().ToLower() == rowName.Trim().ToLower() && r.Answers != null 
     ).SelectMany(a => a.Answers); 

    // get the first relevant answer for the line number specified 
    var answer = answerList.FirstOrDefault(a => a.LineNumber == lineNumber); 

    return answerValueValidator(answer); 

    //return (answer != null && answer.Value); 
} 

업데이트 : 람다 사용과 응답에 따라 제네릭의 제거를 보여, 지금 바로 표시되지 인텔리의 원인이 구문 오류를 통해 자신을 혼란에 대한 유감 작동, 잘하면 사람이 유용한

을 찾을 수 있습니다
private void ValidateSurvey(Survey survey) 
{ 
    // lines 1 to 10, or 1 to 8 or 11 to 16, etc 
    for (var i = survey.FirstLine; i <= survey.LastLine; i++) 
    { 
     IsAnswerValid(survey, "1.1.1", i, a => a != null && a.Value = "foo") 
    } 

} 

private bool IsAnswerValid(
    Survey survey, 
    string rowName, 
    int lineNumber, 
    Func<Answer, bool> answerValueValidator 
) 
{ 
    if (survey == null) 
     throw new ArgumentNullException("survey"); 
    if (answerValueValidator == null) 
     throw new ArgumentNullException("answerValueValidator"); 
    if (string.IsNullOrWhiteSpace(rowName)) 
     throw new ArgumentNullException("Null/blank rowName specified"); 
    if(lineNumber < 0) 
     throw new ArgumentOutOfRangeException("lineNumber must be positive"); 

    // get answer list for the required row 
    var answerList = survey.Rows 
     .Where(
      r => r.Name.Trim().ToLower() == rowName.Trim().ToLower() && r.Answers != null 
     ).SelectMany(a => a.Answers); 

    // get the first relevant answer for the line number specified 
    var answer = answerList.FirstOrDefault(a => a.LineNumber == lineNumber); 

    return answerValueValidator(answer); 
} 
+1

아마 일반적인되어서는 안된다는. – SLaks

+0

@ 실례합니다. 나는 또 다른 모습을 보였고 제네릭 사용은 필요하지 않았다. 그것은 내가 다시 혼란스러워했다. 감사합니다 – Pricey

+0

'String.Equals (x, y. SrtingComparison.OrdinalIgnoreCase)' – SLaks

답변

2

당신은 람다 식을 찾고 :

IsAnswerValid<Answer>(survey, "1.1.1", i, a => a.Something || a.SomethingElse); 
+0

너는 빠르다. @SLaks –

+0

믿거 나 말거나 나는 게시하기 전에 람다를 사용해 보았고 IntelliSense가 속성을 선택하지 않았다. 하지만 분명히 그것의 늦은 점점 나는 약간 코드와 그 작업을 조정했다 :-(나는 (어떤 이유로 나는 이것이 내 타입을 좋아하지 않는다고 생각했지만 지금은 작동 중이다.) – Pricey

1

나는 당신이 당신이 원하는에 이미 가까운 것 같아요 - 변경 시도 이 : 여기에

// get the first relevant answer for the line number specified 
var answer = answerList.FirstOrDefault(a => a.LineNumber == lineNumber); 

는 :

// get the first relevant answer for the line number specified 
var answer = answerList 
    .OfType<TAnswer>() 
    .FirstOrDefault(a => a.LineNumber == lineNumber); 

그런 다음 어떤 Answer -> bool 람다 통과 할 수있는 :

IsAnswerValid<Answer>(survey, "1.1.1", i, ans => ans.LineNumber == 1); 
관련 문제