将ExpandoObject作为参数

时间:2016-03-20 14:41:04

标签: c# dynamic

我有一些像这样的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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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