2012-03-28 7 views
0

J'essaie d'apprendre à créer des contrôles personnalisés, des barres d'outils. En utilisant .NET Reflector, j'ai essayé de "réécrire" la classe ToolStripDesigner (pour l'instant, cela signifie seulement copier le code du réflecteur dans Visual Studio). Parce qu'il utilise de nombreuses classes internes à System.Design.dll, j'ai dû copier d'autres classes avec Reflector. Dans System.Windows.Forms.Design.OleDragDropHandler classe, j'ai trouvé ce code:opérations binaires sur les drapeaux énumération

DragDropEffects allowedEffects = DragDropEffects.Move | DragDropEffects.Copy; 
for (int i = 0; i < components.Length; i++) 
{ 
    InheritanceAttribute attribute = (InheritanceAttribute) TypeDescriptor.GetAttributes(components[i])[typeof(InheritanceAttribute)]; 
    if (!attribute.Equals(InheritanceAttribute.NotInherited) && !attribute.Equals(InheritanceAttribute.InheritedReadOnly)) 
    { 
     allowedEffects &= ~DragDropEffects.Move; 
     allowedEffects |= 0x4000000;  // this causes error 
    } 
} 

énumération DragDropEffects est publique, avec ces domaines:

[Flags] 
public enum DragDropEffects { 
    Scroll = -2147483648, // 0x80000000 
    All = -2147483645,  // 0x80000003 
    None = 0, 
    Copy = 1, 
    Move = 2, 
    Link = 4, 
} 

comme vous pouvez le voir, il n'y a pas de champ avec valeur indiquée dans la première pièce de code (0x4000000). En outre, ce code génère une erreur dans VS: operator |= cannot be applied to operands of type System.Windows.Forms.DragDropEffects and int

Donc, ma question est - comment cela s'est-il compilé? Ou peut-être .NET Reflector a fait une erreur dans le processus de décompilation? Y a-t-il un moyen de le contourner (sans perdre cette étrange information sans nom dans la variable allowedEffects)?

Répondre

1

L'entier est jeté à un objet DragDropEffects , comme on le voit ici ILSpy:

enter image description here

+0

merci pour metioning ILSpy, le temps d'apprendre en utilisant un autre outil;) –

2

Il semble que Reflector ait manqué quelque chose. Afin de rendre vous compilez aurez besoin de jeter explicitement le 0x4000000 à DragDropEffects:

allowedEffects &= ~DragDropEffects.Move; 
allowedEffects |= (DragDropEffects)0x4000000; 
+0

je ne savais pas, qu'il est possible de jeter des valeurs qui ne sont pas spécifiées dans defini d'énumération tion. Merci –

1

changement à cela et il compilera:

allowedEffects |= (DragDropEffects)0x4000000; 
Questions connexes