.net 在单行中写入if条件

.net 在单行中写入if条件,.net,vb.net,aspose,.net,Vb.net,Aspose,是否有一种方法可以在一行中写入以下内容,其中sum函数仅在“InvoiceSum”字段存在时执行(并且不必重复InvoiceSum字段) 这样做的目的是,仅在InvoiceSum作为字段存在于文档中的情况下执行mailmerge,因为GetInvoiceSum函数可能非常昂贵 我希望避免将每个合并字段包装在if条件中,这会污染代码,但也容易出错,因为您必须编写“InvoiceSum”两次。如果您多次执行此操作,则可能会存储Doc.MailMerge.GetFieldNames()的结果,而不是每

是否有一种方法可以在一行中写入以下内容,其中sum函数仅在“InvoiceSum”字段存在时执行(并且不必重复InvoiceSum字段)

这样做的目的是,仅在InvoiceSum作为字段存在于文档中的情况下执行mailmerge,因为GetInvoiceSum函数可能非常昂贵


我希望避免将每个合并字段包装在if条件中,这会污染代码,但也容易出错,因为您必须编写“InvoiceSum”两次。

如果您多次执行此操作,则可能会存储Doc.MailMerge.GetFieldNames()的结果,而不是每次调用它

根据我找到的文档,Doc.MailMerge.GetFieldNames()返回一个字符串数组。如果是,请尝试以下方法:

Dim FieldNames As String() = Doc.MailMerge.GetFieldNames()
If FieldNames.Contains("InvoiceSum") Then Doc.MailMerge.Execute({"InvoiceSum"}, {GetInvoiceSum()})
Private Sub MergeIfExists(FieldName As String, FieldNames As String(), Action As Action)
    If FieldNames.Contains(FieldName) Then Doc.MailMerge.Execute({FieldName}, {Action})
End Sub
或者,如果要创建方法,请尝试以下操作:

Dim FieldNames As String() = Doc.MailMerge.GetFieldNames()
If FieldNames.Contains("InvoiceSum") Then Doc.MailMerge.Execute({"InvoiceSum"}, {GetInvoiceSum()})
Private Sub MergeIfExists(FieldName As String, FieldNames As String(), Action As Action)
    If FieldNames.Contains(FieldName) Then Doc.MailMerge.Execute({FieldName}, {Action})
End Sub
用法:

Dim FieldNames As String() = Doc.MailMerge.GetFieldNames()
MergeIfExists("InvoiceSum", FieldNames, AddressOf GetInvoiceSum)

也许最好也将Doc传递给该方法,但我不确定其类型,因此将把它留给您。

如果您对不同的字段有不同的函数,您可能需要尝试使用字典将字段指向相应的函数。然后,您可以根据是否将MailMerge字段作为键来过滤字典。然后,只对过滤后的字段执行该函数

' build your dictionary of [fieldname, function] somehow
Dim fieldsAndFunctions As New Dictionary(Of String, Func(Of Object))()
fieldsAndFunctions.Add("InvoiceSum", AddressOf GetInvoiceSum)
fieldsAndFunctions.Add("InvoiceAvg", AddressOf GetInvoiceAvg)
fieldsAndFunctions.Add("InvoiceMax", AddressOf GetInvoiceMax)

' get the field names once
Dim existingFields = doc.MailMerge.GetFieldNames()

' filter your dictionary down to only the items whose field names are in your MailMerge object
Dim filteredFieldsAndFunctions = fieldsAndFunctions.
    Where(Function(kvp) existingFields.Contains(kvp.Key))

' call execute, passing the fields and values as arrays
If filteredFieldsAndFunctions.Any() Then
    doc.MailMerge.Execute(
        filteredFieldsAndFunctions.Select(Function(f) f.Key).ToArray(),
        filteredFieldsAndFunctions.Select(Function(f) f.Value()).ToArray())
End If

仅针对存在的字段在末尾计算值。请注意
()
Func.Invoke()

的缩写,意思是“它污染了代码”-怎么回事?通过使代码的意图清晰易懂?“也很容易出错,因为您必须编写“InvoiceSum”两次”-您可以通过(1)使用常量而不是重复该值和(2)在将代码发布到生产环境之前测试代码来解决这个问题。想象一下上面的示例代码有200个mailmerge字段。如果可以像executeEmailMergeifieldExists那样将其放在一行中,那将更加清晰易懂。如果您多次重复一个操作,那么这听起来像是一个将该操作提取到其自己的方法中并多次调用该方法的机会。您可以执行
Doc.MailMerge.Execute(如果需要)吗(Condition,DoThis,DoThat))
如果你需要调用这个函数200次,你应该把它放在一个方法中而不是一个线性函数中。然后把字段放在一个列表中并循环列表。我认为
Action
应该是
Func(of Object)
,Execute将对象数组作为第二个参数,因此应该在那里调用委托。尝试将
{action()}
作为第二个参数。@djv-谢谢。我没有访问MailMerge的权限来测试它,所以依赖于从原始帖子复制代码。很高兴得到更正。