Top.Mail.Ru

Работа с коллекциями .NET в MS DAX

Использование объектов .NET в MS DAX не представляется сложным, те же классы, те же методы. Если столкнуться с коллекциями, то сразу же ступор, а как объявить экземпляр? или как использовать значения коллекции? Как оказалось, это не сложно, но довольно муторно, одна строка C# преобразуется в 2, а то и 3 строки X++. Это довольно громоздко и трудно читается, ну да и ладно.

Казалось бы, простой код C#

System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>();

list.Add(1);
list.Add(2);

Console.WriteLine(list.Count);
Console.WriteLine(list.[1]); 

Но чтобы его реализовать в MS DAX придется извернуться

System.Type                     type; //тип
System.Object                   list; //коллекция
System.Object                   enumerator; //перечисление значений коллекции
System.Reflection.MethodInfo    method; //доступ к методу объекта
System.Reflection.PropertyInfo  property; //доступ к свойству объекта
System.Object[]                 parameters; //входящие параметры для метода
System.Object[]                 nil; //входящие параметры для метода в случае если входных параметров метод не имеет
int                             value; //значение
    
//объявляем параметр для методов не имеющих входные параметры
nil = new System.Object[0]();
//создаем экземпляр коллекции
type = System.Type::GetType("System.Collections.Generic.List`1[System.Int32]");
list = System.Activator::CreateInstance(type);
//наполняем коллекцию значениями
method = type.GetMethod("Add");
parameters = new System.Object[1]();
parameters.SetValue(1, 0);
method.Invoke(list, parameters);
parameters.SetValue(2, 0);
method.Invoke(list, parameters);
//выводим количество элементов в коллекции
property = type.GetProperty("Count");
value = property.GetValue(list, nil);
    
info(strFmt("%1", value));
//создаем перечисление значений коллекции
method = type.GetMethod("GetEnumerator");
enumerator = method.Invoke(list, nil);
//объявляем тип для перечисления
type = System.Type::GetType("System.Collections.Generic.List`1+Enumerator[System.Int32]");
//двигаем курсор на первый элемент коллекции
method = type.GetMethod("MoveNext");
method.Invoke(enumerator, nil);
//выводим первое значение коллекции
property = type.GetProperty("Current");
value = property.GetValue(enumerator, nil);
    
info(strFmt("%1", value));

В результате выполнения этого кода, получим следующее

2
1

Ну, как-то так.

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar