我正在为我正在研究的系统编写一个csv导入引擎,我想避免看起来像那种代码(重复10列的代码):
var field = GetFieldStringValue(columnCode);
if (IsValidDecimal(field))
{
currentRow.Amount = Decimal.Parse(field);
}
else
{
ReportError();
}
最后我选择了一个看起来像这样的方法(各种类型的重载):
private void SetPropertyOrReportError(Action<decimal?> e, string columnCode)
{
if (IsValidDecimal(columnCode))
{
var fieldValue = Decimal.Parse(GetFieldStringValue(columnCode));
e(fieldValue);
}
else if (!IsColumRequired(columnCode))
{
e(null);
}
else
{
SetPropertyOrReportError();
}
}
对于每一行,我最终得到的代码有点像这样:
var currentRow = new ClaimImportHelper();
SetPropertyOrReportError((e) => currentRow.ClaimantName = e, ClaimantNameColumnCode);
SetPropertyOrReportError((e) => currentRow.CustomerName = e, CustomerNameColumnCode);
SetPropertyOrReportError((e) => currentRow.CustomerProject = e, CustomerProjectColumnCode);
SetPropertyOrReportError((e) => currentRow.ClaimDate = e.Value, ClaimDateColumnCode);
SetPropertyOrReportError((e) => currentRow.ClaimSubmitted = e, ClaimSubmittedColumnCode);
SetPropertyOrReportError((e) => currentRow.ExpenseCategory = e, ExpenseCategoryColumnCode);
SetPropertyOrReportError((e) => currentRow.ExpenseType = e, ExpenseTypeColumnCode);
SetPropertyOrReportError((e) => currentRow.Amount = e.Value, AmountColumnCode);
SetPropertyOrReportError((e) => currentRow.PayeeReference = e, PayeeReferenceColumnCode);
SetPropertyOrReportError((e) => currentRow.Detail = e, DetailColumnCode);
SetPropertyOrReportError((e) => currentRow.TransactionDate = e, TransactionDateColumnCode);
parsedItems.Add(currentRow);
我认为更好,因为它更好地表达了它的意图。但是,它仍然不像我希望的那样,我宁愿能够像这样调用这个方法:
SetPropertyOrReportError(currentRow.ClaimantName, ClaimantNameColumnCode);
SetPropertyOrReportError(currentRow.CustomerName, CustomerNameColumnCode);
SetPropertyOrReportError(currentRow.CustomerProject, CustomerProjectColumnCode);
SetPropertyOrReportError(currentRow.ClaimDate, ClaimDateColumnCode);
SetPropertyOrReportError(currentRow.ClaimSubmitted, ClaimSubmittedColumnCode);
我遇到的问题是我无法理解如何编写一个属性的表达式。我怎么能这样做?
答案 0 :(得分:0)
你基本上不能。
当用作方法参数时,表达式currentRow.ClaimantName
将始终表示评估属性的getter的结果。
如果我们得到infoof
operator,可能会有更好的方法 - 但目前,我认为你的lambda选项是最好的选择。请注意,您不需要参数周围的括号 - 例如:
SetPropertyOrReportError(e => currentRow.Detail = e, DetailColumnCode);