Extienda DataTable en C #
Un constructor estático para la clase.SourceManager
Recorre todos los módulos / clases y descubre todas las clases que implementanISource
. Se instanciará cada uno de estos y expondrá unIEnumerable
de ellos como una propiedad estática llamadaIEnumerable<ISource> Sources
. Por simplicidadISource
tiene dos propiedades,DataTable Table { get; }
ystring UniqueName { get; }
. Cuando se crea una instancia de cada diferenteISource
es responsable de poblar suTable
desde SQL, MDX, etc. Para todos losISource
's he escrito hasta ahora, cargando elTable
con todaDataRow
s cuando instanciado ha sido suficiente. sin embargoAhora tengo una situación en la que me gustaría cargar elTable
conDataRow
Es perezoso, en lugar de todo por adelantado. ¿Cómo hago esto? Voy a caminar a través de un ejemplo.
PermissionSource
implementosISource
. SusTable
propiedad, que tiene unaprivate set
se le da un valor denew PermissionDataTable()
. SusUniqueName
es"Permissions"
. A partir de ahora no hay permisos cargados de la base de datos en esteTable
propiedad.
ISource permissionSource = SourceManager.Sources.
Where(s => "Permission".Equals(s.UniqueName)).First();
Ahora hemos obtenido elPermissionSource
, pero a través de una interfaz. Vamos a obtener un permiso.
DataRow row = permissionSource.Table.Rows.Cast<DataRow>().
Where(r => r["PermissionName"].Equals("PermissionName")).First()
He anulado laRows
propiedad enPermissionDataTable
de modo que lo anterior, de alguna manera, obtiene el valor de los permisos asociados con"PermissionName"
en la base de datos Otros permisos no están cargados.
No tengo una opción en el sistema de permisos y no tengo una opción para no usar unDataTable
.
EDITAR:
En mi ejemplo necesitaría anular elRows
propiedad deDataTable
. Rows
, aunque, es unDataRowCollection cual essealed
. Por lo tanto, no hay mucho que se pueda hacer en términos de crear una implementación de DataTable personalizada mínima, como quiero hacer.