c# - 将属性传递给方法时更清晰的实现

标签 c# .net-4.0

我正在为我正在处理的系统编写一个 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);

我遇到的问题是我无法理解如何编写将采用属性的表达式。我该怎么做?

最佳答案

基本上你不能。

表达式 currentRow.ClaimantName,当用作方法参数时,将始终表示评估属性的 getter 的结果。

如果我们得到 infoof operator ,可能有更好的方法 - 但目前,我认为你的 lambda 选项是最好的。请注意,您不需要参数两边的括号 - 例如:

SetPropertyOrReportError(e => currentRow.Detail = e, DetailColumnCode);

关于c# - 将属性传递给方法时更清晰的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3750965/

相关文章:

c#-4.0 - 在 .NET 上实现 DSL

c# - System.Activities.ActivityBuilder 的隐藏工作流参数

c# - 调用此字符串 "String"是危险的还是不好的做法?

c# - 从 Web 应用程序访问 SharePoint 文档库?

c# - 在 .NET Core csproj 文件中更改为 <TargetFrameworks>(复数)时出错

c# - 在 Web API 中生成超媒体链接

c# - 如果计算机在保留内存映射文件时挂起,会发生什么情况?

c# - 使用未处理的异常而不是 Contains()?

c# - 在我以编程方式设置属性后,如何防止双向绑定(bind)更改我的属性

c# - 用户报告具有锁定值的 WPF 控件;这怎么会发生?