CoreUtilerias 2025.8.19
dotnet add package CoreUtilerias --version 2025.8.19
NuGet\Install-Package CoreUtilerias -Version 2025.8.19
<PackageReference Include="CoreUtilerias" Version="2025.8.19" />
<PackageVersion Include="CoreUtilerias" Version="2025.8.19" />
<PackageReference Include="CoreUtilerias" />
paket add CoreUtilerias --version 2025.8.19
#r "nuget: CoreUtilerias, 2025.8.19"
#:package CoreUtilerias@2025.8.19
#addin nuget:?package=CoreUtilerias&version=2025.8.19
#tool nuget:?package=CoreUtilerias&version=2025.8.19
DevKit.Extensions
Extensión de utilidades para .NET que simplifica el manejo de datos, incluyendo operaciones con DataTable
, DataRow
, IDataReader
, cifrado AES y generación de parámetros de consulta.
📦 Características Principales
- Manejo de Datos Avanzado: Conversión entre objetos y DataTables
- Seguridad Integrada: Cifrado AES listo para usar
- Manipulación de Consultas: Generación de cadenas de consulta
- Extensible: Fácil de ampliar con nuevas funcionalidades
- Compatible: Funciona con .NET Standard 2.0+ y .NET 6.0+
📚 Documentación
🧩 DataReaderExtensions
Extensiones para IDataReader
que permiten acceder a columnas por nombre de forma segura y mapear a objetos.
// Ejemplo de uso básico
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetValue<int>("Id");
string nombre = reader.GetValue<string>("Nombre");
DateTime fecha = reader.GetValue<DateTime>("FechaRegistro");
// O convertir directamente a un objeto
var usuario = reader.GetItem<Usuario>();
}
}
🧠 JsonExtensions
Extensiones para trabajar con JSON de manera segura y conveniente.
// Cadena JSON a diccionario (nivel superior)
Dictionary<string, object> dict = jsonString.ToDictionary();
// Cadena JSON (array) a lista de diccionarios
IEnumerable<Dictionary<string, object>> rows = jsonArrayString.ToDictionaryList();
// Deserializar a tipo fuerte
var obj = jsonString.ToObject<MiTipo>();
Notas:
- Ignora mayúsculas/minúsculas de nombres de propiedad
- Ignora valores nulos al escribir y evita ciclos de referencia
- Normaliza
JsonElement
a tipos .NET primarios cuando es posible
Métodos Disponibles:
GetValue<T>(string columnName)
- Obtiene el valor tipado (devuelve default para DBNull)GetItem<T>()
- Convierte la fila actual en un objeto del tipoT
📊 DataTableExtensions
Extensión completa para trabajar con DataTable
que incluye conversión, manipulación y análisis de datos.
🔄 Conversión de Datos
// Convertir lista a DataTable
List<Usuario> usuarios = ObtenerUsuarios();
DataTable tablaUsuarios = usuarios.ToDataTable();
// Convertir objeto único a DataTable
Usuario usuario = ObtenerUsuario(1);
DataTable tablaUsuario = usuario.ToDataTable();
// Convertir DataTable a lista
List<Usuario> listaUsuarios = tablaUsuarios.ToDataList<Usuario>();
🔍 Filtrado y Búsqueda
// Filtrar por columna
DataTable usuariosActivos = tablaUsuarios.FilterByColumn("Activo", true);
// Búsqueda personalizada
var resultados = tablaUsuarios.FindRows(
row => row.Field<string>("Nombre").Contains("Juan")
);
📊 Manipulación de Columnas
// Seleccionar columnas específicas (ignora inexistentes)
var columnasSeleccionadas = tablaUsuarios.SelectColumns("Id", "Nombre", "Email");
// Convertir a lista de diccionarios
IEnumerable<Dictionary<string, object>> filas = tablaUsuarios.ToDictionary();
📈 Ordenamiento
// Ordenar por columna
DataTable ordenado = tablaUsuarios.OrderBy("Nombre");
// Orden descendente
DataTable ordenDescendente = tablaUsuarios.OrderBy("FechaRegistro", false);
📋 Validaciones
// Verificar si existe una columna
bool existeColumna = tablaUsuarios.HasColumn("Email");
// Verificar si la tabla está vacía
bool estaVacia = tablaUsuarios.IsEmpty();
🧹 Manejo de Valores Nulos
// Reemplazar nulos por valor predeterminado
tablaUsuarios.ReplaceNulls(0); // Para números
// Eliminar filas con valores nulos
DataTable sinNulos = tablaUsuarios.RemoveRowsWithNulls();
🔄 Operaciones de Conjunto
// Diferencia entre tablas
DataTable diferencia = tabla1.Except(tabla2, "Id");
// Unión de tablas
DataTable union = tabla1.Union(tabla2);
🔍 Análisis y Depuración
// Obtener estadísticas de columnas numéricas
var estadisticas = tablaUsuarios.GetColumnStatistics();
// Imprimir esquema de la tabla
string esquema = tablaUsuarios.PrintSchema();
🏷 Nombres de Tablas Temporales
// Tabla temporal local (solo visible en la sesión actual)
string nombreLocal = tablaUsuarios.GetTableNameLocal(); // "#Usuarios"
// Tabla temporal global (visible en todas las sesiones)
string nombreGlobal = tablaUsuarios.GetTableNameGlobal(); // "##Usuarios"
🧪 Validación de Tipos
// Verificar si un tipo es "simple" (string, numéricos, bool, fecha, enum, etc.)
bool esSimple = typeof(int).IsSimpleType(); // true
bool esSimple2 = typeof(Usuario).IsSimpleType(); // false
// Validar que un tipo genérico no sea primitivo/simple para conversión a DataTable
public void Procesar<T>()
{
DataTableExtensions.GuardNotPrimitiveType<T>(); // Lanza excepción si T es primitivo/simple
// ...
}
📤 Exportación de Datos
// Exportar a CSV
string csv = tablaUsuarios.WriteToCsv(delimiter: ";");
// Exportar a JSON (formato pretty)
string json = tablaUsuarios.WriteToJson();
🧾 DataRowExtensions
Extensiones para acceder de manera segura a los datos de una fila DataRow
, manejando valores nulos y conversiones de tipos.
// Ejemplo de uso básico
DataRow fila = tablaUsuarios.Rows[0];
// Acceso seguro a los datos
int id = fila.GetValue<int>("Id");
string nombre = fila.GetValue<string>("Nombre");
DateTime? fechaNacimiento = fila.GetValue<DateTime?>("FechaNacimiento");
// Conversión directa a objeto
var usuario = fila.GetItem<Usuario>();
Métodos Disponibles:
GetValue<T>(string columnName)
- Obtiene el valor tipado (devuelve default para DBNull)GetItem<T>()
- Mapea automáticamente la fila a un objeto del tipoT
🔐 SecurityAes
Utilidades estáticas de cifrado simétrico AES para proteger datos sensibles.
// Cifrar datos
string textoPlano = "Información confidencial";
string textoCifrado = SecurityAes.Encrypt(textoPlano);
// Descifrar datos
string textoDescifrado = SecurityAes.Decrypt(textoCifrado);
Características:
- Clave interna de 32 bytes (256-bit)
- Modo de operación: CBC
- Relleno: PKCS7
- IV generado aleatoriamente e incluido en el resultado (prefijo)
Consideraciones de Seguridad:
- La clave está embebida en código para simplicidad; en escenarios reales, considera administrar la clave externamente.
- Valida y controla excepciones de descifrado (texto corrupto o clave incompatible).
Manejo de Errores:
try
{
string resultado = crypto.Decrypt(datosCifrados);
}
catch (CryptographicException ex)
{
// Manejar error de descifrado (clave incorrecta, datos corruptos, etc.)
_logger.LogError(ex, "Error al descifrar los datos");
throw new SecurityException("No se pudo descifrar la información", ex);
}
🌐 QueryStringExtensions
Utilidad para proyectar objetos simples a un diccionario clave-valor para query strings.
Uso Básico:
// Crear parámetros a partir de un objeto anónimo
var filtros = new
{
Nombre = "Juan Pérez",
Edad = 30,
Activo = true,
FechaNacimiento = new DateTime(1990, 5, 15)
};
// Generar diccionario clave-valor
IDictionary<string,string> qs = QueryStringExtensions.BindFrom(filtros);
// Si necesitas la cadena, constrúyela manualmente
string queryString = string.Join("&", qs.Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
Características:
- Tipos soportados: primitivos,
string
,bool
,DateTime
/DateTimeOffset
(formato "yyyy-MM-dd") - Omite valores nulos
- No soporta: arrays/colecciones, objetos anidados, exclusiones ni formatos personalizados (puedes extenderlo si lo necesitas)
Uso con HttpClient:
// Crear URL con parámetros
var baseUrl = "https://api.ejemplo.com/usuarios";
var qs = QueryStringExtensions.BindFrom(new { Pagina = 1, TamanoPagina = 10 });
var query = string.Join("&", qs.Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
var urlCompleta = $"{baseUrl}?{query}";
// Realizar petición HTTP
using var httpClient = new HttpClient();
var respuesta = await httpClient.GetAsync(urlCompleta);
Consideraciones de Seguridad:
- Codifica siempre con
Uri.EscapeDataString
- Evita incluir datos sensibles en query strings
- Considera límites de longitud de URL
Pruebas Unitarias:
[Fact]
public void BindFrom_WithNullValues_ShouldSkipThem()
{
// Arrange
var parametros = new { Nombre = "Juan", Token = (string)null };
// Act
var resultado = QueryStringExtensions.BindFrom(parametros);
// Assert
Assert.Contains("Nombre=Juan", resultado);
Assert.DoesNotContain("Token", resultado);
}
🚀 Cómo Contribuir
¡Agradecemos las contribuciones! Si deseas contribuir a este proyecto, sigue estos pasos:
- Haz un fork del repositorio
- Crea una rama para tu característica (
git checkout -b feature/nueva-funcionalidad
) - Haz commit de tus cambios (
git commit -am 'Añadir nueva funcionalidad'
) - Haz push a la rama (
git push origin feature/nueva-funcionalidad
) - Abre un Pull Request
📋 Guía de Estilo de Código
- Sigue las convenciones de codificación de C#
- Incluye documentación XML en clases y métodos públicos
- Escribe pruebas unitarias para nuevo código
- Mantén la cobertura de código por encima del 80%
- Actualiza la documentación cuando sea necesario
🧪 Ejecutando las Pruebas
# Ejecutar todas las pruebas
dotnet test
# Ejecutar pruebas con cobertura de código
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
📄 Licencia
Este proyecto está licenciado bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
✨ Créditos
- Equipo de Desarrollo - [David Vázquez Palestino]
- Contribuidores - Lista de contribuidores
📞 Soporte
Para reportar problemas o solicitar características, por favor abre un issue en el repositorio.
📚 Recursos Adicionales
<div align="center"> <p>Hecho con ❤️ por el equipo de desarrollo</p> <p>Última actualización: Agosto 2025</p> </div>
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.8)
-
.NETStandard 2.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.8)
-
net6.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.8)
-
net7.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.8)
-
net8.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.8)
-
net9.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.8)
NuGet packages (7)
Showing the top 5 NuGet packages that depend on CoreUtilerias:
Package | Downloads |
---|---|
CoreDatabase
CoreDatabase es una biblioteca de extensiones y utilidades para ADO.NET y SQL Server. Proporciona métodos optimizados para la conexión, consulta y manipulación de datos en bases de datos SQL Server. Compatible con múltiples versiones de .NET (4.8, 8.0 y 9.0) y Microsoft.Data.SqlClient. |
|
CoreControlesUsuario
CoreControlesUsuario es una biblioteca de extensiones y componentes personalizados para DevExpress WinForms. Proporciona herramientas optimizadas para el desarrollo de aplicaciones Windows Forms, incluyendo extensiones para GridControl, LookUpEdit y otros controles populares de DevExpress. Compatible con .NET 9.0 y Windows Forms. |
|
CoreDbContext
El paquete contiene extensiones y utilerias para ADO.NET, SQL SERVER y EXCEL |
|
CoreOracleDatabase
CoreOracleDatabase es una biblioteca de extensiones y utilidades para el acceso a Oracle Database. Proporciona métodos optimizados para la conexión, consulta y manipulación de datos en bases de datos Oracle. Compatible con múltiples versiones de .NET (6.0, 7.0, 8.0 y 9.0) y utiliza Oracle.ManagedDataAccess.Core para la conexión eficiente a Oracle Database. |
|
CoreExcelPackage
CoreExcelPackage es una biblioteca de extensiones y utilidades para la manipulación de archivos Excel en .NET. Proporciona métodos optimizados para la lectura, escritura y procesamiento de datos en archivos Excel, incluyendo importación/exportación de datos, formateo y generación de informes. Compatible con múltiples versiones de .NET (4.8, 6.0, 7.0, 8.0 y 9.0) y utiliza ExcelDataReader para la lectura eficiente de archivos. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated | |
---|---|---|---|
2025.8.19 | 6 | 8/19/2025 | |
2025.8.13 | 95 | 8/13/2025 | |
2025.8.10 | 90 | 8/11/2025 | |
2025.8.7 | 153 | 8/8/2025 | |
2025.7.24 | 442 | 7/24/2025 | |
2025.7.23 | 436 | 7/24/2025 | |
2025.7.21 | 482 | 7/22/2025 | |
2025.7.18 | 34 | 7/18/2025 | |
2025.7.17 | 114 | 7/17/2025 | |
2025.7.13 | 140 | 7/14/2025 | |
2025.7.8 | 145 | 7/8/2025 | |
2025.7.2 | 130 | 7/4/2025 | |
2025.5.25 | 116 | 5/24/2025 | |
2025.5.24 | 76 | 5/24/2025 | |
2025.5.23 | 80 | 5/23/2025 | |
2025.5.14 | 265 | 5/15/2025 | |
2025.5.8 | 165 | 5/8/2025 | |
2025.5.5 | 157 | 5/6/2025 | |
2025.5.4 | 158 | 5/4/2025 | |
2025.5.1 | 158 | 5/1/2025 | |
2025.4.30 | 152 | 4/30/2025 | |
2025.4.29 | 152 | 4/27/2025 | |
2025.3.22 | 204 | 3/22/2025 | |
2025.3.8 | 172 | 3/9/2025 | |
2025.2.16 | 231 | 2/17/2025 | |
2025.2.1 | 135 | 2/1/2025 | |
2025.1.30 | 130 | 1/28/2025 | |
2025.1.7 | 169 | 1/7/2025 | |
2024.12.2 | 166 | 12/2/2024 | |
2024.11.30 | 141 | 12/1/2024 | |
2024.11.16 | 114 | 11/15/2024 | |
2024.11.15 | 112 | 11/15/2024 | |
2024.11.14 | 116 | 11/14/2024 | |
2024.11.12 | 146 | 11/12/2024 | |
2024.11.6 | 121 | 11/7/2024 | |
2024.11.1 | 120 | 11/1/2024 | |
2024.10.23 | 125 | 10/23/2024 | |
2024.10.9 | 152 | 10/9/2024 | |
2024.10.6 | 147 | 10/4/2024 | |
2024.9.5 | 178 | 9/5/2024 | |
2024.8.14 | 161 | 8/14/2024 | |
2024.8.13 | 165 | 8/14/2024 | |
2024.7.24 | 156 | 7/24/2024 | |
2024.7.13 | 138 | 7/14/2024 | |
2023.11.30 | 447 | 12/11/2023 | |
2023.11.25 | 179 | 11/27/2023 | |
2023.11.15 | 240 | 11/16/2023 | |
2023.10.29 | 253 | 10/30/2023 | |
2023.8.20 | 275 | 8/21/2023 | |
2023.8.14 | 245 | 8/14/2023 | |
2023.8.9 | 239 | 8/9/2023 | |
2023.7.11 | 294 | 7/12/2023 | |
2023.6.18 | 275 | 6/19/2023 | |
2023.5.20 | 271 | 5/16/2023 | |
2023.5.14 | 276 | 5/8/2023 | |
2023.5.6 | 294 | 4/29/2023 | |
2023.4.28 | 331 | 4/26/2023 | |
2023.4.16 | 324 | 4/17/2023 | |
2023.4.3 | 328 | 4/4/2023 | |
2023.3.251 | 347 | 3/31/2023 | |
2023.3.25 | 325 | 3/25/2023 | |
2023.2.26 | 447 | 2/27/2023 | |
2023.2.18 | 404 | 2/19/2023 | |
2023.2.11 | 415 | 2/11/2023 | |
2023.2.7 | 379 | 2/7/2023 | |
2023.2.3 | 376 | 2/3/2023 | |
2023.1.30 | 402 | 1/31/2023 | |
2023.1.20 | 405 | 1/20/2023 | |
2023.1.19 | 376 | 1/19/2023 | |
2023.1.12 | 417 | 1/12/2023 | |
2023.1.11 | 398 | 1/11/2023 | |
2023.1.8 | 441 | 1/8/2023 | |
2023.1.7 | 406 | 1/7/2023 | |
2023.1.5 | 398 | 1/5/2023 | |
2022.12.23 | 403 | 12/23/2022 | |
2022.12.22 | 423 | 12/22/2022 | |
2022.12.20 | 412 | 12/20/2022 | |
2022.12.19 | 412 | 12/19/2022 | |
2022.12.18 | 391 | 12/19/2022 | |
2022.10.29 | 479 | 10/28/2022 | |
2022.10.28 | 545 | 10/28/2022 | |
2022.10.5 | 478 | 10/6/2022 | |
2022.1.7 | 452 | 1/7/2023 |