在Microsoft Dynamics、365中,为什么我不能内联一个FormDataSource的实例?
In Microsoft Dynamics, 365, why can't I inline an instance of FormDataSource?
我有以下编译方法:
private void onModifiedFilter(FormControl sender)
{
FormDataSource mainAccount_ds = sender.formRun()
.dataSource(formDataSourceStr(MainAccount, MainAccount));
mainAccount_ds.executeQuery();
}
由于 mainAccount_ds
没有其他用途,我想内联该值并将代码简化为:
private void onModifiedFilter(FormControl sender)
{
sender.formRun()
.dataSource(formDataSourceStr(MainAccount, MainAccount))
.executeQuery();
}
然而,编译失败:
Severity Code Description Project File Line Suppression State
Error ClassDoesNotContainMethod: Class 'FormObjectSet' does not contain a definition for method 'executeQuery' and no extension method 'executeQuery' accepting a first argument of type 'FormObjectSet' is found on any extension class. Packt_MainAccountExtension (ISV) [ExpenseManagement] C:\AOSService\PackagesLocalDirectory\Bin\XppSource\ExpenseManagement\AxClass_Packt_MainAccountForm_Extension.xpp 18
- How/why 捕获
mainAccount_ds
会改变此方法的编译能力吗?
- 有没有其他方法可以在不捕获不必要的数据的情况下表达这一点?
- 在 D365 的其他什么时候我应该期待一些魔法,我需要捕获一个值才能使用它,而不是直接调用未捕获的 return 值的方法?
回答您的主要问题:因为编译器无法根据 dataSource
方法的 return 值确定正确的向下转换类型。
回答您的其他问题:
- "How/why 捕获 mainAccount_ds 会改变此方法的编译能力吗?"
mainAccount_ds
变量的添加告诉编译器在 运行 时期望 dataSource
方法的 return 值的类型。注意executeQuery
方法只在FormDataSource
class中定义,而在FormObjectSet
父class中没有定义,是[=47]的类型=] dataSource
方法的值。
- “有没有其他方法可以在不捕获不必要的数据的情况下表达这一点?”
我不这么认为。虽然有一个 as
运算符可以进行显式向下转换,但我还没有找到在链式方法调用表达式中使用它的方法。
- “在 D365 中还有什么时候我应该期待一些魔法,我需要捕获一个值才能使用它,而不是直接在未捕获的 return 值上调用方法?”
我希望其他答案能说明这里没有魔法发生。在这种情况下,编译器会正确地阻止您进行未定义的向下转换。
此外,您可能想阅读 x++. Casting and Expression operators 中的演员表是一个很好的起点。
我有以下编译方法:
private void onModifiedFilter(FormControl sender)
{
FormDataSource mainAccount_ds = sender.formRun()
.dataSource(formDataSourceStr(MainAccount, MainAccount));
mainAccount_ds.executeQuery();
}
由于 mainAccount_ds
没有其他用途,我想内联该值并将代码简化为:
private void onModifiedFilter(FormControl sender)
{
sender.formRun()
.dataSource(formDataSourceStr(MainAccount, MainAccount))
.executeQuery();
}
然而,编译失败:
Severity Code Description Project File Line Suppression State Error ClassDoesNotContainMethod: Class 'FormObjectSet' does not contain a definition for method 'executeQuery' and no extension method 'executeQuery' accepting a first argument of type 'FormObjectSet' is found on any extension class. Packt_MainAccountExtension (ISV) [ExpenseManagement] C:\AOSService\PackagesLocalDirectory\Bin\XppSource\ExpenseManagement\AxClass_Packt_MainAccountForm_Extension.xpp 18
- How/why 捕获
mainAccount_ds
会改变此方法的编译能力吗? - 有没有其他方法可以在不捕获不必要的数据的情况下表达这一点?
- 在 D365 的其他什么时候我应该期待一些魔法,我需要捕获一个值才能使用它,而不是直接调用未捕获的 return 值的方法?
回答您的主要问题:因为编译器无法根据 dataSource
方法的 return 值确定正确的向下转换类型。
回答您的其他问题:
- "How/why 捕获 mainAccount_ds 会改变此方法的编译能力吗?"
mainAccount_ds
变量的添加告诉编译器在 运行 时期望 dataSource
方法的 return 值的类型。注意executeQuery
方法只在FormDataSource
class中定义,而在FormObjectSet
父class中没有定义,是[=47]的类型=] dataSource
方法的值。
- “有没有其他方法可以在不捕获不必要的数据的情况下表达这一点?”
我不这么认为。虽然有一个 as
运算符可以进行显式向下转换,但我还没有找到在链式方法调用表达式中使用它的方法。
- “在 D365 中还有什么时候我应该期待一些魔法,我需要捕获一个值才能使用它,而不是直接在未捕获的 return 值上调用方法?”
我希望其他答案能说明这里没有魔法发生。在这种情况下,编译器会正确地阻止您进行未定义的向下转换。
此外,您可能想阅读 x++. Casting and Expression operators 中的演员表是一个很好的起点。