CoreUtilerias 2025.7.21
dotnet add package CoreUtilerias --version 2025.7.21
NuGet\Install-Package CoreUtilerias -Version 2025.7.21
<PackageReference Include="CoreUtilerias" Version="2025.7.21" />
<PackageVersion Include="CoreUtilerias" Version="2025.7.21" />
<PackageReference Include="CoreUtilerias" />
paket add CoreUtilerias --version 2025.7.21
#r "nuget: CoreUtilerias, 2025.7.21"
#:package CoreUtilerias@2025.7.21
#addin nuget:?package=CoreUtilerias&version=2025.7.21
#tool nuget:?package=CoreUtilerias&version=2025.7.21
DotNet.ExtensionsToolkit
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 y convertirlas de forma segura.
// Ejemplo de uso básico
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32("Id");
string nombre = reader.GetString("Nombre");
DateTime fecha = reader.GetDate("FechaRegistro");
// O convertir directamente a un objeto
var usuario = reader.GetItem<Usuario>();
}
}
Métodos Disponibles:
GetInt32(string columnName)
GetString(string columnName)
GetDecimal(string columnName)
GetDate(string columnName)
GetGuid(string columnName)
GetBoolean(string columnName)
GetDouble(string columnName)
GetBytes(string columnName)
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
// Añadir columna si no existe
tablaUsuarios.AddColumnIfNotExist("FechaActualizacion", typeof(DateTime));
// Seleccionar columnas específicas
var columnasSeleccionadas = tablaUsuarios.SelectColumns("Id", "Nombre", "Email");
// Convertir a diccionario
var diccionario = 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 primitivo
bool esPrimitivo = typeof(int).IsPrimitive(); // true
bool esPrimitivo2 = typeof(Usuario).IsPrimitive(); // false
// Validar que un tipo no sea primitivo (útil para genéricos)
public void Procesar<T>()
{
typeof(T).GuardIsPrimitive(); // Lanza excepción si T es primitivo
// ...
}
📤 Exportación de Datos
// Exportar a CSV
string csv = tablaUsuarios.ToCsv(delimiter: ";");
// Exportar a JSON (usando System.Text.Json)
string json = JsonSerializer.Serialize(tablaUsuarios);
🧾 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.GetInt32("Id");
string nombre = fila.GetString("Nombre");
DateTime? fechaNacimiento = fila.GetDate("FechaNacimiento"); // Devuelve DateTime?
// Conversión directa a objeto
var usuario = fila.GetItem<Usuario>();
Métodos Disponibles:
GetInt32(string columnName)
- Obtiene un entero de 32 bitsGetString(string columnName)
- Obtiene una cadena (maneja DBNull)GetDecimal(string columnName)
- Obtiene un valor decimalGetDate(string columnName)
- Obtiene un DateTime? (nullable)GetGuid(string columnName)
- Obtiene un GuidGetBoolean(string columnName)
- Obtiene un valor booleanoGetDouble(string columnName)
- Obtiene un número de punto flotanteGetBytes(string columnName)
- Obtiene un array de bytesGetItem<T>()
- Mapea automáticamente la fila a un objeto del tipoT
Manejo de Valores Nulos:
// Valor predeterminado personalizado
int edad = fila.GetInt32("Edad", -1); // Retorna -1 si es nulo
// Valor predeterminado genérico
DateTime fecha = fila.GetDate("FechaRegistro") ?? DateTime.MinValue;
🔐 SecurityAes
Implementación de cifrado simétrico AES (Advanced Encryption Standard) para proteger datos sensibles.
// Inicialización con clave personalizada
var crypto = new SecurityAes("clave-secreta-32-caracteres");
// Cifrar datos
string textoPlano = "Información confidencial";
string textoCifrado = crypto.Encrypt(textoPlano);
// Descifrar datos
string textoDescifrado = crypto.Decrypt(textoCifrado);
Características:
- Tamaños de clave soportados: 128, 192 y 256 bits
- Modo de operación: CBC (Cipher Block Chaining)
- Relleno: PKCS7
- IV (Vector de Inicialización): Generado aleatoriamente e incluido en el resultado
Mejores Prácticas:
Almacenamiento seguro de claves:
// En producción, usa un gestor de secretos var keyVaultUrl = "https://tu-keyvault.vault.azure.net/"; var secretClient = new SecretClient(new Uri(keyVaultUrl), new DefaultAzureCredential()); string encryptionKey = (await secretClient.GetSecretAsync("EncryptionKey")).Value.Value;
Rotación de claves: Implementa un sistema para rotar las claves periódicamente
Validación de datos: Siempre valida los datos antes de cifrarlos/descifrarlos
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 generar cadenas de consulta (query strings) a partir de objetos, ideal para construir URLs de API.
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),
Intereses = new[] { "programación", "música", "deportes" }
};
// Generar query string
var queryString = QueryStringExtensions.BindFrom(filtros);
// Resultado: "Nombre=Juan%20P%C3%A9rez&Edad=30&Activo=true&FechaNacimiento=1990-05-15&Intereses=programaci%C3%B3n&Intereses=m%C3%BAsica&Intereses=deportes"
Características:
Tipos soportados:
- Tipos primitivos (int, string, bool, etc.)
- DateTime (formateado como "yyyy-MM-dd")
- Enumeraciones (usando el valor numérico)
- Arrays y colecciones (se repite el parámetro para cada valor)
- Objetos anidados (usando notación de puntos)
Personalización de formato de fecha:
// Especificar formato personalizado var opciones = new QueryStringOptions { DateTimeFormat = "yyyy/MM/dd HH:mm:ss" }; var queryString = QueryStringExtensions.BindFrom(filtros, opciones);
Exclusión de propiedades:
// Excluir propiedades específicas var opciones = new QueryStringOptions { ExcludeProperties = new[] { "Token", "Contraseña" } };
Uso con HttpClient:
// Crear URL con parámetros
var baseUrl = "https://api.ejemplo.com/usuarios";
var queryParams = QueryStringExtensions.BindFrom(new { Pagina = 1, TamañoPagina = 10 });
var urlCompleta = $"{baseUrl}?{queryParams}";
// Realizar petición HTTP
using var httpClient = new HttpClient();
var respuesta = await httpClient.GetAsync(urlCompleta);
Consideraciones de Seguridad:
- Codificación URL: Todos los valores son correctamente codificados para URL
- Datos sensibles: No incluir nunca contraseñas o tokens en query strings (usar headers HTTP en su lugar)
- Tamaño de URL: Las URLs tienen un límite de longitud (alrededor de 2000 caracteres en la mayoría de navegadores)
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: Julio 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.6)
-
.NETStandard 2.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.6)
-
net6.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.6)
-
net7.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.6)
-
net8.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.6)
-
net9.0
- System.Data.DataSetExtensions (>= 4.5.0)
- System.Text.Json (>= 9.0.6)
NuGet packages (5)
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.7.21 | 15 | 7/22/2025 | |
2025.7.18 | 31 | 7/18/2025 | |
2025.7.17 | 112 | 7/17/2025 | |
2025.7.13 | 138 | 7/14/2025 | |
2025.7.8 | 143 | 7/8/2025 | |
2025.7.2 | 128 | 7/4/2025 | |
2025.5.25 | 115 | 5/24/2025 | |
2025.5.24 | 75 | 5/24/2025 | |
2025.5.23 | 79 | 5/23/2025 | |
2025.5.14 | 264 | 5/15/2025 | |
2025.5.8 | 164 | 5/8/2025 | |
2025.5.5 | 156 | 5/6/2025 | |
2025.5.4 | 157 | 5/4/2025 | |
2025.5.1 | 157 | 5/1/2025 | |
2025.4.30 | 151 | 4/30/2025 | |
2025.4.29 | 151 | 4/27/2025 | |
2025.3.22 | 202 | 3/22/2025 | |
2025.3.8 | 171 | 3/9/2025 | |
2025.2.16 | 229 | 2/17/2025 | |
2025.2.1 | 133 | 2/1/2025 | |
2025.1.30 | 129 | 1/28/2025 | |
2025.1.7 | 168 | 1/7/2025 | |
2024.12.2 | 165 | 12/2/2024 | |
2024.11.30 | 140 | 12/1/2024 | |
2024.11.16 | 113 | 11/15/2024 | |
2024.11.15 | 111 | 11/15/2024 | |
2024.11.14 | 115 | 11/14/2024 | |
2024.11.12 | 145 | 11/12/2024 | |
2024.11.6 | 120 | 11/7/2024 | |
2024.11.1 | 119 | 11/1/2024 | |
2024.10.23 | 124 | 10/23/2024 | |
2024.10.9 | 151 | 10/9/2024 | |
2024.10.6 | 146 | 10/4/2024 | |
2024.9.5 | 177 | 9/5/2024 | |
2024.8.14 | 160 | 8/14/2024 | |
2024.8.13 | 164 | 8/14/2024 | |
2024.7.24 | 152 | 7/24/2024 | |
2024.7.13 | 137 | 7/14/2024 | |
2023.11.30 | 445 | 12/11/2023 | |
2023.11.25 | 179 | 11/27/2023 | |
2023.11.15 | 239 | 11/16/2023 | |
2023.10.29 | 251 | 10/30/2023 | |
2023.8.20 | 268 | 8/21/2023 | |
2023.8.14 | 239 | 8/14/2023 | |
2023.8.9 | 233 | 8/9/2023 | |
2023.7.11 | 287 | 7/12/2023 | |
2023.6.18 | 268 | 6/19/2023 | |
2023.5.20 | 263 | 5/16/2023 | |
2023.5.14 | 268 | 5/8/2023 | |
2023.5.6 | 286 | 4/29/2023 | |
2023.4.28 | 323 | 4/26/2023 | |
2023.4.16 | 315 | 4/17/2023 | |
2023.4.3 | 320 | 4/4/2023 | |
2023.3.251 | 339 | 3/31/2023 | |
2023.3.25 | 317 | 3/25/2023 | |
2023.2.26 | 439 | 2/27/2023 | |
2023.2.18 | 396 | 2/19/2023 | |
2023.2.11 | 407 | 2/11/2023 | |
2023.2.7 | 371 | 2/7/2023 | |
2023.2.3 | 368 | 2/3/2023 | |
2023.1.30 | 394 | 1/31/2023 | |
2023.1.20 | 397 | 1/20/2023 | |
2023.1.19 | 368 | 1/19/2023 | |
2023.1.12 | 409 | 1/12/2023 | |
2023.1.11 | 390 | 1/11/2023 | |
2023.1.8 | 433 | 1/8/2023 | |
2023.1.7 | 398 | 1/7/2023 | |
2023.1.5 | 390 | 1/5/2023 | |
2022.12.23 | 395 | 12/23/2022 | |
2022.12.22 | 415 | 12/22/2022 | |
2022.12.20 | 403 | 12/20/2022 | |
2022.12.19 | 404 | 12/19/2022 | |
2022.12.18 | 383 | 12/19/2022 | |
2022.10.29 | 471 | 10/28/2022 | |
2022.10.28 | 529 | 10/28/2022 | |
2022.10.5 | 471 | 10/6/2022 | |
2022.1.7 | 436 | 1/7/2023 |