2012-03-28 14 views
0

Ich versuche zu lernen, wie benutzerdefinierte Steuerelemente, Symbolleisten erstellen. Mit .NET Reflector habe ich versucht, die ToolStripDesigner-Klasse "umzuschreiben" (im Moment bedeutet das nur, Code von Reflector in Visual Studio zu kopieren). Da es viele interne Klassen von System.Design.dll verwendet, musste ich einige weitere Klassen mit Reflector kopieren. In System.Windows.Forms.Design.OleDragDropHandler Klasse, habe ich diesen Code gefunden:binäre Operationen auf Flags Enumeration

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 
    } 
} 

Dragdropeffects-Enumeration ist öffentlich, mit diesen Bereichen:

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

wie Sie sehen können, gibt es kein Feld mit dem Wert im ersten Stück gezeigt von Code (0x4000000). Auch dieser Code löst einen Fehler in VS: operator |= cannot be applied to operands of type System.Windows.Forms.DragDropEffects and int

Also meine Frage ist - wie hat das kompiliert? Oder hat .NET Reflector beim Dekompilierungsprozess einen Fehler gemacht? Gibt es eine Möglichkeit, es zu umgehen (ohne diese seltsame, unbenannte Information in allowedEffects Variable zu verlieren)?

Antwort

1

Die ganze Zahl in ein Dragdropeffects-Objekt umgewandelt wird , wie hier in ILSpy gesehen:

enter image description here

+0

danke für die ILSpy, Zeit zu lernen mit einem anderen Werkzeug;) –

2

Es sieht aus wie Reflektor etwas verpasst. Um müssen es kompilieren machen Sie explizit die 0x4000000 zu DragDropEffects würfen

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

ich nicht wusste, dass es möglich ist, Werte zu werfen, die in Aufzählung defini nicht angegeben werden tion. Danke –

1

ändert es dazu und es wird kompilieren:

allowedEffects |= (DragDropEffects)0x4000000;