/// <summary>
 /// Obtiene un diccionario poblado desde el componente Query de una Uri
 /// parseado segun el formato donde '&' separa registros y '=' separa
 /// la clave del valor.
 /// </summary>
 /// <remarks>
 /// En caso de parametros repetidos se sobreescribe al ultimo valor, si
 /// falta el caracter '=' se saltea dicho parametro.
 /// </remarks>
 /// <param name="uri"></param>
 /// <returns></returns>
 public static Dictionary <string, string> QueryToDictionary(this Uri uri)
 {
     try
     {
         var result         = new Dictionary <string, string>();
         var query          = uri.GetComponents(UriComponents.Query, UriFormat.Unescaped);
         var nameValuePairs = query.TrimStart('?').Split("&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
         foreach (var pair in nameValuePairs)
         {
             var vars = pair.Split('=');
             if (vars.GetLength(0) != 2)
             {
                 SimpleTrace.Trace(typeof(ExtensionMethods).FullName, "QueryToDictionary, Invalid Query Format at pair '{0}' of '{1}'", pair, uri.Query);
                 continue;
             }
             if (!result.ContainsKey(vars[0]))
             {
                 result.Add(vars[0], vars[1]);
             }
             else
             {
                 result[vars[0]] = vars[1];
             }
         }
         return(result);
     }
     catch (Exception e)
     {
         SimpleTrace.Exception(typeof(ExtensionMethods).FullName, e, "Uri.QueryToDictionary");
         return(null);
     }
 }
 public static void RECORD(this object obj, string type, string inp, string outp, params object[] args)
 {
     SimpleTrace.Trace(typeof(ExtensionMethods).FullName, "{0}:{1,10} '{2}' '{3}' context: {4}", obj.NODE(), type, inp, outp, obj.CONTEXT(args));
 }