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
)?
merci pour metioning ILSpy, le temps d'apprendre en utilisant un autre outil;) –