ОТВЕТ НА НЕПРАВИЛЬНЫЙ ВОПРОС:
Если я правильно понимаю проблему, это так:
Чтобы передать перечисления в MATLAB, вам нужно преобразовать его в тип переменной, понятный MATLAB- в этом случае строка.Таким образом, ваше перечисление
BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
преобразуется в
"Public, Instance" // via flags.ToString()
Когда код возвращается в .NET из MATLAB, вы хотите преобразовать строку обратно в перечисление.
Вы были очень близки, и пример на странице справки для Enum.Parse дает вам синтаксис.
BindingFlags flags2 = (BindingFlags)Enum.Parse(typeof(BindingFlags), "Public, Instance");
(Кроме того, присвоение переменной enum толькособираюсь закончиться слезами.)
ВТОРАЯ ПОПЫТКА НА ОТВЕТ
Я согласен, что это поведение MATLAB кажется нарушенным.Одним из решений было бы написать свои собственные обёртки для Enum.Parse
и Enum.Object
, которые не ломаются.Примерно так:
function enum = EnumParse(typename, value)
import System.*;
type = Type.GetType(typename);
values = regexp(value, ', ', 'split');
enum = cell(1, length(values));
for i = 1:length(values)
enum{i} = Enum.Parse(type, values{i});
end
end
function enum = EnumToObject(typename, value)
import System.*;
type = Type.GetType(typename);
values = int32(GetPowersOf2(value));
enum = cell(1, length(values));
for i = 1:length(values)
enum{i} = Enum.ToObject(type, values(i));
end
end
function y = GetPowersOf2(x)
index = logical(arrayfun(@str2num, dec2bin(x)));
y = 2.^((length(index) - 1):-1:0);
y = y(index);
end
Их использование, например,
EnumParse('System.Reflection.BindingFlags', 'Public, Instance')
EnumToObject('System.Reflection.BindingFlags', 20)
Обратите внимание, что я выбрал простой путь и только что возвратил массив ячеек BindingFlags, а непытаясь убедить MATLAB объединить их снова.