编程语言
首页 > 编程语言> > 这是泛型和C#动态数据类型的适当使用吗?

这是泛型和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