2012-05-08 4 views
8

Potrzebuję zrobić ogólny rejestrator, aby nagrać określone instrukcje wstawiania/aktualizacji, aby moi testerzy mogli zweryfikować poprawność wprowadzanych danych.Czy istnieje jeszcze możliwość iteracji za pośrednictwem obiektu DynamicParameters Dapper?

Moja pierwsza myśl polegała na tym, że po prostu użyłbym funkcji, która zaakceptowałaby DynamicParameters, a następnie przepuściłbym przez DynamicParameters, by wygenerować ciąg znaków, aby wyświetlić nazwę parametru i jego wartość oraz ułatwić odczytanie dla testerów.

Niestety Dapper.DynamicParameters nie zawiera definicji publicznej dla "GetEnumerator"

Oto prosty przykład tego, co miałem nadzieję zrobić:

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

Odpowiedz

5

Spróbuj:

  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

Dziękuję za pomoc Sam. BTW, kochanie Dapper, zaoszczędziło mi to czasu i bólu głowy. Kiedy próbuję powyższego kodu, otrzymuję ... "Dapper.DynamicParameters" nie zawiera definicji "ParameterNames". – SLoret

+7

@Sam Szafran Otrzymuję następujący wyjątek podczas śledzenia kodu: [NullReferenceException: Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu.] Dapper.DynamicParameters.Get (nazwa ciągu) w c: \ Dev \ Dapper \ Dapper \ SqlMapper.cs: 2574 –

+2

Otrzymuję ten sam wyjątek, co Gary. Wszelkie aktualizacje na ten temat? –

-1

Na wszelki wypadek,

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); 
} 

Pracowałem dla mnie.

+0

To nie pomoże w sytuacjach, w których chcę zamknąć abstrakcję. Gdybym umieścił to w metodzie FormatDynamicParameters, wymagałbym teraz, aby wszyscy moi konsumenci przekazywali wystąpienie DynamicParameters i implementację 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

Rzut na SqlMapper.IParameterLookup pomógł mi uniknąć wyjątku NullReferenceException, który otrzymywałem podczas próby iteracji w kolekcji przed użyciem w instancji IDbConnection. Dzięki! –

+0

Po latach - to rozwiązało. –

+0

Dziękuję za to, pomógł przy pisaniu testów jednostkowych, które potwierdziły prawidłowe parametry, gdy były podłączone do właściwych wartości w wywołaniach do naszego opakowania Dappera – nrjohnstone