【问题标题】:passing ExpandoObject as parameter将 ExpandoObject 作为参数传递
【发布时间】:2016-03-20 14:41:04
【问题描述】:

我有一些这样的 sql 函数(用 C# 编写):

public void Query(string sqlText, ExpandoObject paramSet) {
    SqlCommand cmd = new SqlCommand(...)
    foreach (var item in paramSet) {
        cmd.Parameters.AddWithValue(item.Key, item.Value);
    }
    var reader = cmd.ExecuteReader(...);
    ...
}

并且想这样调用:

dbHandler.Query("SELECT * FROM ... WHERE loginID = @loginID", new { loginID = "username" });

我想使用 ExpandoObject 来保存参数集的原因是:

1.ExpandoObject实现了IDictionary接口,可以避免反射;

2.我不想写额外的行来声明一个新的 Dictionary 对象来存储值(传递匿名类型会减少编码)。

但是编译器报错如下:

cannot convert from '<anonymous type: string loginID>' to 'System.Dynamic.ExpandoObject'

有没有办法解决这个问题? :P

【问题讨论】:

    标签: c# dynamic


    【解决方案1】:

    这个最简单的答案是不要自己重新发明它。只需使用Dapper,它就提供了这些类型的扩展并处理参数以及将结果读取器映射到您的类。

    【讨论】:

    • 感谢该工具!
    【解决方案2】:

    匿名类型不是扩展对象。您需要创建一个。

    dynamic user = new ExpandoObject();
    user.loginID = "username";
    dbHandler.Query("SELECT * FROM ... WHERE loginID = @loginID", user);
    

    但是现在您没有正确设置参数的 SqlDbType,这可能会导致数据库出现意外行为。您必须在 expando 的字段上调用 ​​GetType() 并映射到 SqlDbType 并且您似乎试图避免出现混乱。

    【讨论】:

    • 是的,它可以工作,但是它会浪费额外的行来将一些变量声明为我想避免的“动态”。无论如何,非常感谢!
    猜你喜欢
    • 2013-09-30
    • 2019-03-26
    • 2020-09-18
    • 2015-05-24
    • 2012-11-10
    • 2020-10-30
    • 2014-02-25
    • 1970-01-01
    相关资源
    最近更新 更多