我在这里有一个不完整和破碎的例子,我想知道是否可以将一个函数传递给另一个将Model和属性考虑在内的函数?请参阅下面示例中的评论,我的意思是。
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);
}
更新:根据答案显示lambda使用和删除泛型,现在很抱歉让我自己因语法错误而导致智能感知无法出现,希望有人可能会发现这个有用
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);
}
答案 0 :(得分:2)
您正在寻找lambda表达式:
IsAnswerValid<Answer>(survey, "1.1.1", i, a => a.Something || a.SomethingElse);
答案 1 :(得分: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
lambda:
IsAnswerValid<Answer>(survey, "1.1.1", i, ans => ans.LineNumber == 1);