2012-05-08 24 views
8

Necesito hacer un registrador genérico para registrar ciertas instrucciones de inserción/actualización para que mis probadores puedan verificar que los datos que se insertan son correctos.¿Hay alguna forma de iterar a través de un objeto Dapper DynamicParameters?

Lo primero que pensé fue que solo utilizaría una función que acepta DynamicParameters y me gustaría utilizar los DynamicParameters para generar una cadena para enumerar el nombre y el valor del parámetro y facilitar su lectura para los testers.

Desafortunadamente, Dapper.DynamicParameters no contiene una definición pública para "GetEnumerator"

Aquí es ejemplo básico de lo que estaba esperando a hacer:

string myFormattedListofParameters = ""; 
foreach (var p in myDynamicParameters) 
{ 
myFormattedListofParameters += p.Name + "=" + p.Value.ToString(); 
} 

Respuesta

5

Probar:

  var sb = new StringBuilder(); 
      foreach (var name in p.ParameterNames) 
      { 
       var pValue = p.Get<dynamic>(name); 
       sb.AppendFormat("{0}={1}\n", name, pValue.ToString()); 
      } 
+0

Gracias por la ayuda Sam. Por cierto, amor Dapper, me ha ahorrado tanto tiempo y dolor de cabeza. Cuando pruebo el código de arriba, obtengo ... 'Dapper.DynamicParameters' no contiene una definición para 'ParameterNames'. – SLoret

+7

@Sam Saffron Recibo la siguiente excepción cuando sigo el código: [NullReferenceException: referencia de objeto no establecida en una instancia de un objeto.] Dapper.DynamicParameters.Get (String name) en c: \ Dev \ Dapper \ Dapper \ SqlMapper.cs: 2574 –

+2

Recibo la misma excepción que Gary aquí. ¿Alguna actualización sobre esto? –

-1

Por las dudas,

var pmaster = new Dapper.DynamicParameters();        
SortedList l = new SortedList(); 
l.Add("param1", object1); 
l.Add("param2", object2); 
l.Add("param3", object3); 
l.Add("param4", object4); 

foreach(var key in l.Keys) 
{ 
    var val = l[key]; 
    pmaster.Add(key.ToString(), val); 
} 

Funcionó para mí.

+0

Esto no ayudaría en situaciones donde quiero encapsular la abstracción. Si tuviera que poner esto en un método, digamos FormatDynamicParameters, ahora requeriría que todos mis consumidores pasen en una instancia de DynamicParameters y una implementación IList. –

5
string ParametersToString(DynamicParameters parameters) 
    { 
     var result = new StringBuilder(); 

     if (parameters != null) 
     { 
      var firstParam = true; 
      var parametersLookup = (SqlMapper.IParameterLookup)parameters; 
      foreach (var paramName in parameters.ParameterNames) 
      { 
       if (!firstParam) 
       { 
        result.Append(", "); 
       } 
       firstParam = false; 

       result.Append('@'); 
       result.Append(paramName); 
       result.Append(" = "); 
       try 
       { 
        var value = parametersLookup[paramName];// parameters.Get<dynamic>(paramName); 
        result.Append((value != null) ? value.ToString() : "{null}"); 
       } 
       catch 
       { 
        result.Append("unknown"); 
       } 
      } 

     } 
     return result.ToString(); 
    } 
+0

El envío a SqlMapper.IParameterLookup me ayudó a evitar la NullReferenceException que recibía al intentar recorrer la colección antes de usarla en una instancia de IDbConnection. ¡Gracias! –

+0

Años después - esto lo resolvió. –

+0

Gracias por esto, nos ayudó cuando escribimos pruebas de unidad que afirmaron que los parámetros correctos estaban conectados a los valores correctos en las llamadas a nuestro contenedor Dapper. – nrjohnstone

Cuestiones relacionadas