Tag: 访问者

使一个对象只能访问同一个程序集中的另一个对象?

每个业务对象都有一个包含sql调用的匹配对象。 我想以这样的方式限制这些sql对象,它们只能由匹配的业务对象使用。 怎么能实现这一目标? 更新 Greg提出了关于可测试性的观点。 由于SqlObjects将包含非常特定于业务流程的sql,因此我不希望它们在多个buiness对象中重用。 (基本的CRUD操作都是代码生成的)有没有办法使SqlObjects只能访问业务程序集中的一个业务对象(如yshuditelu和Greg Beech所示)并将SqlObjects暴露给unit testing程序集?

在C#中组合多播委托 – 我应该使用运算符还是Action.Combine?

阅读文档我可以看到+运算符可用于组合/组合相同类型的委托。 以同样的方式,我可以看到我可以使用-运算符从组合委托中删除a。 我还注意到Action类型具有静态Combine和Remove方法,这些方法可用于连接两个委托的调用列表,并分别从另一个委托的调用列表中删除委托的最后一次出现的调用列表。 Action a = () => Debug.WriteLine(“Invoke a”); Action b = () => Debug.WriteLine(“Invoke b”); a += b; a.Invoke(); //Invoke a //Invoke b Action c = () => Debug.WriteLine(“Invoke c”); Action d = () => Debug.WriteLine(“Invoke d”); Action e = Action.Combine(c, d); e.Invoke(); //Invoke c //Invoke d a -= b; a.Invoke(); //Invoke a […]

在C#中使用“dynamic”来实现访问者模式

我有一个应用程序,我在一系列元素上执行操作,操作的确切性质取决于所操作元素的类型。 由于封装的原因,元素不适合实现操作; 这意味着它不能是元素类型的虚方法,所以’标准’多态不起作用。 我提出了一个与之相关的问题 ,并被告知这被称为访客模式。 我以前总是使用基于对象类型的if/elseif调度程序方法实现它,然后调用适当的实现。 然而,最近,我注意到同样的事情可能是使用dynamic关键字完成,如下所示: private void ReconcileTips() { foreach (var step in _definition.Steps) { ReconcileTips((dynamic)step); } } private void ReconcileTips(IBulkDispenseDefinition bulkDispense) { bulkDispense.TipType = ReconcileTip(bulkDispense.TipType); } private void ReconcileTips(ImportScreenDefinition importScreen) { foreach (var usage in importScreen.ReagentUsages) usage.TipType = ReconcileTip(usage.TipType); } private void ReconcileTips(BuildScreenDefinition buildScreen) { foreach (var function in buildScreen.Functions) function.TipType = […]

使用LINQ ExpressionVisitor将基本参数替换为lambda表达式中的属性引用

我正在为我们系统的一部分编写数据层,该数据层记录有关每天运行的自动作业的信息 – 作业名称,运行时间,结果,等等。 我正在使用Entity Framework与数据库交谈,但我试图将这些细节隐藏在更高级别的模块之外,我不希望实体对象本身被暴露。 但是,我想使我的界面在用于查找工作信息的标准中非常灵活。 例如,用户界面应允许用户执行复杂的查询,例如“给我所有名为’hello’的作业,该作业在上午10:00到11:00之间运行失败。” 显然,这看起来像是动态构建的Expression树的工作。 所以我希望我的数据层(存储库)能够接受类型为Expression<Func> (lambda表达式)的LINQ表达式,然后在后台转换该lambda表达式,我的Entity Framework ObjectContext可以用作Where()子句中的filter。 简而言之,我正在尝试将Expression<Func>类型的lambda表达式转换为Expression<Func> ,其中svc_JobAudit是Entity Framework数据对象,对应于存储作业信息的表。 (第一个委托中的四个参数分别对应于作业名称,运行时间,结果以及分别在MS中花费的时间) 我使用ExpressionVisitor类取得了很好的进展,直到我碰到一堵砖墙并收到带有此错误消息的InvalidOperationException : 从“VisitLambda”调用时,重写“System.Linq.Expressions.ParameterExpression”类型的节点必须返回相同类型的非null值。 或者,覆盖“VisitLambda”并将其更改为不访问此类型的子项。 我完全不知所措。 为什么它不会允许我将引用参数的表达式节点转换为引用属性的节点? 还有另一种方法可以解决这个问题吗? 以下是一些示例代码: namespace ExpressionTest { class Program { static void Main(string[] args) { Expression<Func> expression = (myString, myDateTime, myResultCode, myTimeSpan) => myResultCode == ResultCode.Failed && myString == “hello”; var result = ConvertExpression(expression); } […]

重构代码以避免类型转换

我在.Net 4.0中有以下C#代码。 它需要对IRetailBusiness进行IBusiness的类型转换。 //Type checking if (bus is IRetailBusiness) { //Type casting investmentReturns.Add(new RetailInvestmentReturn((IRetailBusiness)bus)); } if (bus is IIntellectualRights) { investmentReturns.Add(new IntellectualRightsInvestmentReturn((IIntellectualRights)bus)); } 业务场景: 我正在为投资控股公司设计软件系统。 该公司拥有零售业务和IntellectualRights业务。 BookShop和AudioCDShop是零售业务的例子。 EngineDesignPatent和BenzolMedicinePatent是IntellectualRights业务的例子。 这两种业务类型完全不相关。 这家投资公司有一个名为InvestmentReturn的概念(但每个企业对这个概念都完全无知)。 InvestmentReturn是从每个业务获得的利润,并使用ProfitElement进行ProfitElement 。 对于每种“业务类型”(Retail,IntellectualRights),使用的ProfitElement是不同的。 题 如何重构此类设计以避免此type casting和type checking ? 摘要投资 public abstract class InvestmentReturn { public double ProfitElement { get; set; } public IBusiness Business{ get; […]

公共变量与具有访问器的私有变量

有没有人见过人们这样做: private string _name; public string Name{ get{ return _name; } set{ _name = value;}} 我理解使用访问器,如果你要对它的设置方式进行某种控制,或者在有get时对其执行某种function。 但是如果你只是要这样做,为什么不把变量公之于众? 我错过了什么吗?