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

标签 c# generics c#-4.0 dynamic data-access-layer

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

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

要点是参数直接添加到字符串中而不是作为参数化查询,在 Gentle 中可以将其添加为参数化查询,这就是我一直在做的事情。我们所有的 DAL 都继承自基类 GentleDAL,这是实际构造 Gentle 查询、添加子句和参数等的类。要在 Gentle 中添加参数化子句,您必须使用 SqlBuilder 做两件事对象,你必须调用 sb.AddConstraint(string clause) 来添加你的子句,然后对于每个参数你必须调用 sb.AddParameter(string name, Type type),然后您可以从中构造您的 SqlStatement 对象,并且只有在那之后您才能在调用 stmt.SetParameter(string name, object value).

我表示这些参数/子句的方式是我创建了一个名为 GentleClauseCollection 的类,它包含子句和参数,并且具有用于这两种东西的 Add 和 Get 方法。子句只是字符串,内部存储在列表中,参数存储在使用泛型的 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 类中,我将参数存储在一个列表中,并从此类中获取参数作为 IEnumerable。我的类中的 Add 方法只能允许添加 GentleParameter,因此我知道我的参数将始终具有我可以访问的名称、值和参数类型字段。

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

预先感谢您的帮助。

最佳答案

由于 sb.SetParameter 不是通用的并且等待 object,我不会将 GentleParameter 设为通用的,因此我不会使用 DLR .

关于c# - 这是对泛型和 C# 的动态数据类型的适当使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677300/

相关文章:

c# - 如何获取cmd的输出?

Java JComboBox 泛型

c# - 如何获取小部件的索引以及为什么它只给出第一个值

c# - 谁能解释这个 'has no implementation' 错误?

c# - 从代码隐藏访问 div 标签

c# - 如何使用 T4 将类从一个项目转换到另一个项目?

C# 泛型不允许委托(delegate)类型约束

generics - 推断变量 K 具有不兼容的界限

null - C#4 : how to in-line detect for nulls?

linq - 具有数据对象的动态LINQ