我有一个荒谬的情况(不要怪我,它是第三方软件),在这里我需要有两个引用(Erp.Contracts.BO.Quote和Erp.Contracts.BO.SalesOrder),但是类型为Erp.Tablesets。在两个程序集中都定义了QuoteQtyRow!

如何在代码中使用它们?

void Absurdity()
{
    Erp.Tablesets.QuoteQtyRow qqr_Quote = null; //<-- my intention is to use the one from the quote assembly here.
    Erp.Tablesets.QuoteQtyRow qqr_SO = null; //<-- my intention is to use the one from the sales order assembly here.
}


编译器将引发错误。即:“两个程序集中都存在类型'Erp.Tablesets.QuoteQtyRow'。”

编辑:局限性:


我没有使用此答案Class with same name in two assemblies (intentionally)中提供的extern别名的灵活性。我受到第三方软件提供的环境的限制。我本质上需要一种在方法体内进行区分的方法。
我知道我可以通过使用dynamic关键字完全避免此问题,但是我正在寻找一种可能的强类型解决方案。
可能没有解决方案,但是我想在放弃问题之前用尽所有资源。

最佳答案

Epicor ERP使用一种工具将数据库中的表放到数据集中,然后放到业务对象中。合同程序集中描述了此业务对象,但是当您使用两个引用同一张表的业务对象时发现,会遇到问题。这是SerialNumber表中更常见的问题。

我从您的笔记中了解到,您正在Epicor ERP应用程序内的方法指令或数据指令中提供方法主体代码。它在客户端上输入并存储在数据库中,但是在服务器上的Deployment \ Server \ BPM \ Sources \ BO文件夹中生成代码,并被编译到Deployment \ Server \ Customization \ BO文件夹中。

在BPM设计器的“执行自定义代码”工作流项中,无法为引用的DLL指定别名。 SCR 148549中要求提供此修复程序。没有项目文件可供您编辑,即使每次启用和禁用BPM都会重新生成它。

但是,如果使用“调用外部方法”工作流项目,则可以构建自己的dll并将其放在Deployment \ Server \ Customization \ Externals文件夹中。要做到这一点:


在BPM的方法指令维护中,为您的方法单击操作>创建编程接口,然后复制代码。
在Visual Studio中创建一个新的类库项目
将复制的代码粘贴到.cs文件中
添加程序集-框架参考:


System.Data.Entity
System.ServiceModel
系统交易

将文件引用添加到


Bin \ Epicor.ServiceModel.dll
程序集\ Epicor.Ice.dll
程序集\ Epicor.System.dll
程序集\ Ice.Data.Model.dll
程序集\ Erp.Data.910100.dll

并为BPM的BO添加参考,即


Assemblies \ Erp.Contracts.BO.Quote.dll

确保所有引用的“本地复制”均设置为false。
Ice.ContextBoundBase<Erp.ErpContext>继承
添加一个带上下文public MyQuote (Erp.ErpContext ctx) : base(ctx){ }的构造函数


您无法完全复制并粘贴“ Execute Custom Code”正文,因为您无权访问tt行变量,这些变量都在ds中。

09-28 09:45