Работа с коллекциями .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!