ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

这是泛型和C#动态数据类型的适当使用吗?

2019-12-08 06:06:19  阅读:217  来源: 互联网

标签:c-4-0 generics dynamic data-access-layer c


因此,我遇到的问题是,我们正在使用现有的ORM(这是一个古老的名为Gentle的旧ORM)构建数据访问层,其想法是迁移到Fluent NHibernate之类的东西.在一些查询中,我们必须在现有设置中向SqlBuilder添加自定义子句,因此例如,在检索某些person对象时,我们可能会添加一个子句,例如:

"PersonId in (SELECT PersonId from Orders where OrderValue > " + orderValue + " and OrderName = " + orderName

关键是参数是直接添加到字符串中而不是作为参数化查询添加的,在Gentle中可以将其作为参数化查询添加,这就是我一直在努力的事情.我们所有的DAL都继承自基本的GentleDAL,这是实际上构造Gentle查询,添加子句和参数等的类.要在Gentle中添加参数化子句,您必须对SqlBuilder对象做两件事,您必须调用sb .AddConstraint(string子句)添加子句,然后对于每个参数,您必须调用sb.AddParameter(string name,Type type),然后可以从中构造SqlStatement对象,只有在此之后才能设置值用于您在其中调用stmt.SetParameter(字符串名称,对象值)的参数.

我表示这些参数/子句的方式是,我创建了一个名为GentleClauseCollection的类,该类包含子句和参数,并且具有针对这两种情况的Add和Get方法.子句只是字符串,内部存储在List中,参数存储在使用泛型的GentleParameter类中. GentleParameter的完整代码如下.

public class GentleParameter<TParamType>
{       
    public string Name { get; private set; }
    public TParamType Value { get; private set; }
    public Type ParameterType  {get { return typeof (TParamType); }}
    public GentleParameter(string parameterName, TParamType parameterValue)
    {
        Name = parameterName;
        Value = parameterValue;
    }
}

我知道的.NET中没有任何集合,可以让我在同一集合中为TParamType的不同值存储GentleParameter,但是可以使用DLR来完成.在我的GentleCollection类中,我将参数存储在一个List中,并以IEnumerable的形式从此类中获取参数.我的班级中的Add方法仅允许添加GentleParameter,因此我知道我的参数将始终具有可访问的Name,Value和ParameterType字段.

我的问题是:鉴于我可以牺牲泛型并将参数类的Value属性更改为“对象”而不是T,我是否通过使用动态方法使事情变得过于复杂,这两种方法的优缺点是什么?有没有我想到的第三种方法?考虑到所有使用动态对象的方法调用都将在运行时进行编译,使用动态变量可能会对性能产生多大的影响?

在此先感谢您的帮助.

解决方法:

由于sb.SetParameter不是通用的并且正在等待对象,因此我不会使GentleParameter通用,因此不会使用DLR.

标签:c-4-0,generics,dynamic,data-access-layer,c
来源: https://codeday.me/bug/20191208/2089488.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有