2013-09-24 25 views
4

我有一些函数,其原型看起来有点像这样: public void doThings(string sql, dynamic dParams);传递动力参数与ExpandoObject

它确实某种SQL与这些参数查询。我没有写,但我必须使用它。

doThings("select * from SomeTable where [email protected] and [email protected]", 
     new 
     { 
      v1 = new Dapper.DbString() 
      { 
       Value = "yay", 
       IsAnsi = true, 
       Length = 50 
      }, 
      v2 = new Dapper.DbString() 
      { 
       Value = "really", 
       IsAnsi = true, 
       Length = 32 
      } 
     }); 

而不是当我第一次把动态PARAMS到ExpandoObject:

dynamic dynParams = new ExpandoObject(); 
dynParams.v1 = new Dapper.DbString() 
    { 
     Value = "yay", 
     IsAnsi = true, 
     Length = 50 
    } 
doThings("query here", dynParams); 

查询然后返回任何结果,当我做这样的事情,它工作正常。我不想叫doThings()和写入new块十倍十个不同的场景,我可能要查询myval2myval3等。有没有什么特别的方式可以传递ExpandoObject,或者我应该这样做的其他方式?

回答

0

看起来doThings使用反射来获取需要的值,当你写:

new { 
    v1 = 1, 
    v2 = "foo" 
} 

你与两个属性v1v2创建一个类型,但是当你使用 您ExpandoObjectExpandoObject添加任何新属性(它的所有魔术行为都是编译器生成的东西)。

如果你想使用doThing的属性已知在编译时,我明白,没有 问题。当在运行时知道属性时,我可以考虑的唯一方法是在运行时使用Reflection.Emit生成所需的匿名类型。看看this的文章。

2

小巧玲珑不支持expandos将默认,但你可以传递的expando到Dictionary<string,object>的构造函数,然后传递的动态参数。

0

作为@迈克尔B已经提到的,小巧精致的不支持expandos将作为PARAMS。

如果您需要根据此article动态创建参数集 ,则可以使用DynamicParameters

因此,你可以建立一个翻译从dynParamsDynamicParameters,它看起来是这样的:

dynamic dynParams = new ExpandoObject(); 
dynParams.v1 = new Dapper.DbString() 
{ 
    Value = "yay", 
    IsAnsi = true, 
    Length = 50 
}; 

var parameters = new Dapper.DynamicParameters(); 

((ExpandoObject)dynParams).ToList().ForEach(kvp => parameters.Add(kvp.Key, kvp.Value)); 

它认为它可能是一个不错的功能。