ここにこの不完全で壊れた例があります。モデルとプロパティを考慮して関数を別の関数に渡すことができるかどうか知りたいですか? 私が何を意味するかについては、以下の例のコメントを参照してください。
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);
}