Если вы хотите, чтобы структура данных была удобной для элементов управления сеткой с автоматической генерацией столбцов, тогда предпочтительной структурой данных будет DataTable
.A DataTable
подобен динамическому двумерному массиву данных, организованному по строкам и столбцам, и это именно то, что вам нужно.На самом деле столбцы индексируются строками, что также является тем, что вы хотите.Все, что нам нужно сделать, если найти способ обратиться к строкам DataTable
по строке, и все будет готово!
Вот реализация PermissionMap
, которая равна DataTable
, чтобы вы могли использовать его с элементами управления сеткой, но также имеет некоторую инфраструктуру для поддержки индексации по двум строкам.Точный подход может варьироваться, но основная идея состоит в том, чтобы начать с DataTable
, а затем добавить:
- Конструктор, который предоставляет пользовательские действия
- Метод
AddUser
длядобавьте новых пользователей и установите разрешения по умолчанию - A индексатор с двумя параметрами для получения и установки разрешений для пользователя и действия
Вот пример реализации:
public enum Permission
{
Default = 0,
Disallow = 0,
Allow = 1,
}
public class PermissionMap : DataTable
{
private Dictionary<string, int> actionMap = new Dictionary<string, int>();
public PermissionMap(IEnumerable<string> actions)
{
Columns.Add(new DataColumn("Action"));
int i = 0;
foreach (var action in actions)
{
actionMap.Add(action, i++);
var row = NewRow();
row["Action"] = action;
Rows.Add(row);
}
}
public void AddUser(string user)
{
Columns.Add(new DataColumn(user));
foreach (DataRow row in Rows)
row[user] = Permission.Default;
}
public Permission this[string user, string action]
{
get { return (Permission)Rows[actionMap[action]][user]; }
set { Rows[actionMap[action]][user] = value; }
}
}
И вот небольшая демонстрационная программа:
class Program
{
static void Main(string[] args)
{
var permissionMap = new PermissionMap(new[] { "Read", "Write" });
permissionMap.AddUser("Bill");
permissionMap.AddUser("Jane");
permissionMap["Bill", "Read"] = Permission.Allow;
permissionMap["Jane", "Write"] = Permission.Allow;
foreach (DataColumn column in permissionMap.Columns)
{
Console.Write(column.ColumnName);
Console.Write(",");
}
Console.WriteLine();
foreach (DataRow row in permissionMap.Rows)
{
foreach (DataColumn column in permissionMap.Columns)
{
Console.Write(row[column]);
Console.Write(",");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
, которая производит этот вывод:
Action,Bill,Jane,
Read,Allow,Disallow,
Write,Disallow,Allow,