gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:29:03 26 4
gpt4 key购买 nike

因此,我遇到的问题是,我们正在使用我们现有的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com