2010-01-22 5 views
1

Je rencontre toutes sortes de problèmes avec [FlagsAttribute] enums dans Matlab. Il semble qu'il n'y ait aucun moyen de transmettre une combinaison de valeurs en tant que paramètre à .NET. Par exemple, BindingFlags.Public | BindingFlags.Instance, une fois que vous les combinez dans Matlab, ils deviennent de type interne et ne peuvent pas être convertis en BindingFlags.Matlab 2009b & .NET

choses comme

import System.*; 
import System.Reflection.*; 

flags = BindingFlags.Public+BindingFlags.Instance; 
enum = Enum.ToObject(Type.GetType('System.Reflection.BindingFlags'), int32(flags)); 

ou

enum = Enum.Parse(Type.GetType('System.Reflection.BindingFlags'), 'Public, Instance'); 

ne fonctionnent tout simplement pas comme il se lit comme suit:

??? Un ou plusieurs arguments de sortie non affectés lors de l'appel à "System.Enum.ToObject" (ou "System.Enum.Parse").

D'autre part

enum = Enum.Parse(Type.GetType('System.Reflection.BindingFlags'), 'Public'); 

fonctionne très bien et retourne < System.Reflection.BindingFlags 1x1> Déf 'Public'.

Cela va, il va sans dire, pour tous les enums [FlagsAttribute].

Ai-je oublié quelque chose ici? Écrire une enveloppe de réflexion C# pour Matlab n'est pas un gros problème, mais cela ralentirait énormément les choses. Toute solution de contournement serait profondément, profondément appréciée.

Répondre

0

UNE REPONSE A LA MAUVAISE QUESTION:

Si je comprends le problème correctement, il est ceci:

Pour passer énumérations Matlab, vous devez le convertir en un type de variable que Matlab comprend – dans ce cas une chaîne. Ainsi, votre ENUM

BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; 

est converti en

"Public, Instance" // via flags.ToString() 

Lorsque le code revient à .NET de Matlab, vous voulez convertir la chaîne de nouveau à être un ENUM.

Vous étiez très proche, et l'exemple sur le help page for Enum.Parse vous donne la syntaxe.

BindingFlags flags2 = (BindingFlags)Enum.Parse(typeof(BindingFlags), "Public, Instance"); 

(également, en nommant un "ENUM" variable ne va finir en larmes.)


UNE TENTATIVE DEUXIÈME À UNE RÉPONSE

Je suis d'accord que ce comportement Matlab semble cassé . Une solution serait d'écrire vos propres wrappers à Enum.Parse et Enum.Object, qui ne cassent pas. Quelque chose comme ceci:

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 

L'utilisation de ceux-ci est, par ex.,

EnumParse('System.Reflection.BindingFlags', 'Public, Instance') 
EnumToObject('System.Reflection.BindingFlags', 20) 

Notez que j'ai pris la route facile ici et juste retourné un réseau de cellules de BindingFlags, plutôt que d'essayer de persuader de les combiner Matlab à nouveau.

+0

Malheureusement, ce n'est pas comment j'ai décrit le problème. Tout votre code est en C#. Tout mon code est dans Matlab (c'est pourquoi nommer une variable "enum" est complètement légitime). Alors, s'il vous plaît, lisez attentivement ma question. Il n'y a pas d'eau dedans. Appréciez votre contribution quand même. – jbarr

+0

Oh, oui, et merci d'avoir correctement formulé ma question en premier lieu. J'espère qu'une fois que vous prendrez un second regard, vous pourrez m'aider. – jbarr

+0

Oh bien. Deuxième essai. La fonction "EnumToObject" crée et retourne un tableau de cellules mais n'effectue pas la tâche en question: mettre un objet enum à une valeur "20" ou toute autre combinaison de drapeaux (par opposition à un seul drapeau, comme "Public") de Matlab . – jbarr

0

(Ce n'est pas une réponse, un peu plus d'informations)

Au moment de l'écriture, ne fournit pas d'une interface .NET qui vous permet de travailler avec énumérations drapeau la dernière version de Matlab (2010b).

L'un des éléments fondamentaux de .NET que MATLAB ne prend pas en charge est le casting. Cela signifie une ligne de code comme ceci:

myControl.Anchor = (AnchorStyles)(AnchorStyles.Top | AnchorStyles.Bottom) 

Ne peut pas être écrit en Matlab.

La méthode .NET System.Enum.Parse serait idéale pour résoudre le problème de création d'énumérations combinées de drapeaux dans MATLAB. Mais, lorsqu'il est appelé à partir de MATLAB, System.Enum.Parse est rompu.

Essayez ceci:

>> NET.addAssembly('System.Windows.Forms'); 
>> anchorStylesTypeName = 'System.Windows.Forms.AnchorStyles, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'; 
>> anchorType = System.Type.GetType(anchorStylesTypeName); 
>> enum = System.Enum.Parse(anchorType, '1') 

enum = 

    Top 
>> 
>> % That looked good! 
>> enum = System.Enum.Parse(anchorType, '2') 

enum = 

    Bottom 
>> 
>> % OK, now we combine them... 
>> enum = System.Enum.Parse(anchorType, '3') 
??? One or more output arguments not assigned during call to 
"_class_dot_paren". 

La même fonction fonctionne très bien lorsqu'il est exécuté en C#: Passage "3" à System.Enum.Parse retours "Top, Bottom".