Rozszerz DataTable w C #
Konstruktor statyczny dla klasySourceManager
przechodzi przez wszystkie moduły / klasy i odkrywa wszystkie klasy, które implementująISource
. Utworzy instancję każdego z nich i wyeksponujeIEnumerable
z nich jako właściwość statyczna o nazwieIEnumerable<ISource> Sources
. Dla prostotyISource
ma dwie właściwości,DataTable Table { get; }
istring UniqueName { get; }
. Gdy każda instancja jest innaISource
jest odpowiedzialny za wypełnianie jejTable
z SQL, MDX itp. Dla wszystkichISource
napisałem do tej pory, ładujęTable
ze wszystkimiDataRow
s, gdy wystąpienie jest wystarczające. jednakMam teraz sytuację, w której chciałbym załadowaćTable
zDataRow
jest leniwie, a nie z przodu. Jak mam to zrobic? Przejdę przez przykład.
PermissionSource
narzędziaISource
. JegoTable
własność, która maprivate set
otrzymuje wartośćnew PermissionDataTable()
. JegoUniqueName
jest"Permissions"
. W tej chwili nie ma żadnych uprawnień załadowanych z bazy danych do tegoTable
własność.
ISource permissionSource = SourceManager.Sources.
Where(s => "Permission".Equals(s.UniqueName)).First();
Teraz otrzymaliśmyPermissionSource
, ale przez interfejs. Zdobądźmy pozwolenie.
DataRow row = permissionSource.Table.Rows.Cast<DataRow>().
Where(r => r["PermissionName"].Equals("PermissionName")).First()
PrzesłoniłemRows
nieruchomość wPermissionDataTable
aby powyższy sposób w jakiś sposób uzyskał wartość uprawnień związanych z"PermissionName"
w bazie danych. Inne uprawnienia nie są ładowane.
Nie mam wyboru w systemie uprawnień i nie mam wyboru, aby nie używaćDataTable
.
EDYTOWAĆ:
W moim przykładzie musiałbym nadpisaćRows
własnośćDataTable
. Rows
jest jednakDataRowCollection który jestsealed
. W związku z tym nie można zrobić wiele, jeśli chodzi o tworzenie minimalnej niestandardowej implementacji DataTable, jak chcę to zrobić.