CoreUtilerias 2026.2.2
dotnet add package CoreUtilerias --version 2026.2.2
NuGet\Install-Package CoreUtilerias -Version 2026.2.2
<PackageReference Include="CoreUtilerias" Version="2026.2.2" />
<PackageVersion Include="CoreUtilerias" Version="2026.2.2" />
<PackageReference Include="CoreUtilerias" />
paket add CoreUtilerias --version 2026.2.2
#r "nuget: CoreUtilerias, 2026.2.2"
#:package CoreUtilerias@2026.2.2
#addin nuget:?package=CoreUtilerias&version=2026.2.2
#tool nuget:?package=CoreUtilerias&version=2026.2.2
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 leer datos de forma segura, manejando automáticamente valores nulos y conversiones de tipos.
using (var reader = command.ExecuteReader())
{
// Opción 1: Convertir todo a una lista (¡Nuevo!)
List<Usuario> usuarios = reader.ToList<Usuario>();
// Opción 2: Leer fila por fila
while (reader.Read())
{
// Mapeo automático a objeto
var usuario = reader.GetItem<Usuario>();
// O lectura manual de columnas
int id = reader.GetValue<int>("Id");
string nombre = reader.GetValue<string>("Nombre");
}
}
🔑 ExpressionConditionExtractor (Nuevo)
Genera claves de texto únicas a partir de expresiones lógicas (Lambdas). Es ideal para crear claves de caché (como en Redis) que sean consistentes y fáciles de leer.
// Ejemplo: Crear una clave para caché basada en filtros
var clave = ExpressionConditionExtractor.BuildRedisKey<Usuario>(
u => u.Activo == true && u.Id > 100
);
// Resultado generado: "Usuario:Activo=1:Id>100"
// Nota: Ordena automáticamente las condiciones para que el orden no afecte la clave.
🧠 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
JsonElementa 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 | 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 was computed. 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 is compatible. 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 Framework | net48 is compatible. net481 was computed. |
-
.NETFramework 4.8
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 10.0.2)
-
net10.0
- System.Data.DataSetExtensions (>= 4.5.0)
-
net6.0
- System.Text.Json (>= 10.0.2)
-
net8.0
- System.Text.Json (>= 10.0.2)
-
net9.0
- System.Text.Json (>= 10.0.2)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on CoreUtilerias:
| Package | Downloads |
|---|---|
|
CoreDatabase
DevKit.ExecutionEngine.SqlServer 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, 9.0 y 10.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 |
|---|---|---|
| 2026.2.2 | 94 | 2/3/2026 |
| 2026.1.17 | 138 | 1/13/2026 |
| 2026.1.16 | 94 | 1/13/2026 |
| 2026.1.15 | 90 | 1/13/2026 |
| 2026.1.14 | 97 | 1/13/2026 |
| 2026.1.13 | 92 | 1/12/2026 |
| 2026.1.11 | 98 | 1/12/2026 |
| 2026.1.10 | 108 | 1/9/2026 |
| 2026.1.9 | 94 | 1/9/2026 |
| 2026.1.7 | 112 | 1/7/2026 |
| 2025.12.25 | 194 | 12/24/2025 |
| 2025.12.24 | 176 | 12/24/2025 |
| 2025.12.13 | 190 | 12/6/2025 |
| 2025.12.12 | 147 | 12/6/2025 |
| 2025.12.11 | 143 | 12/6/2025 |
| 2025.12.10 | 156 | 12/6/2025 |
| 2025.12.9 | 145 | 12/6/2025 |
| 2025.12.8 | 148 | 12/6/2025 |
| 2025.12.7 | 151 | 12/6/2025 |
| 2025.12.6 | 148 | 12/6/2025 |