InvalidCastException casting objet à son propre type
-
29-09-2019 - |
Question
Actuellement, je suis complètement dérouté par le problème que je vais avoir.Je suis en train d'écrire un plug-in pour une autre application qui fournit au public .NET DE L'API.J'ai créé une classe nommée Room
et je suis en utilisant une grille de propriété pour permettre aux utilisateurs de voir et d'éditer les propriétés de la Room
les instances.Quelques propriétés sont limités à un ensemble de valeurs standard.Donc je suis en utilisant des TypeDescriptors avec GetStandardValues()
remplace pour obtenir la propriété de la grille pour afficher une liste déroulante de ces propriétés.
C'était tout fonctionne très bien.J'ai été faire les menus déroulants, et j'ai pu modifier les valeurs pas de problème.Pourtant, aujourd'hui, pour quelque raison que quand je sélectionne un Room
la grille des propriétés affiche les propriétés du type de descripteurs comme une boîte noire.
Si je clique sur la case devient blanc, et je reçois un curseur clignotant, mais je ne peux pas taper quoi que ce soit.Si je puis sélectionnez une autre Pièce de mon programme se bloque avec l'exception suivante:
System.InvalidCastException was caught
Message=Unable to cast object of type 'DVAMC.Room' to type 'DVAMC.Room'.
Source=DVAMC
StackTrace:
at DVAMC.BuildingTypeConverter.GetStandardValuesSupported(ITypeDescriptorContext context) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\BuildingTypeConverter.cs:line 14
at System.Windows.Forms.PropertyGridInternal.GridEntry.get_Flags()
at System.Windows.Forms.PropertyGridInternal.GridEntry.get_NeedsDropDownButton()
at System.Windows.Forms.PropertyGridInternal.PropertyDescriptorGridEntry.get_NeedsDropDownButton()
at System.Windows.Forms.PropertyGridInternal.PropertyGridView.SelectRow(Int32 row)
at System.Windows.Forms.PropertyGridInternal.PropertyGridView.SelectGridEntry(GridEntry gridEntry, Boolean fPageIn)
at System.Windows.Forms.PropertyGridInternal.PropertyGridView.GridPositionData.Restore(PropertyGridView gridView)
at System.Windows.Forms.PropertyGridInternal.PropertyGridView.Refresh(Boolean fullRefresh, Int32 rowStart, Int32 rowEnd)
at System.Windows.Forms.PropertyGridInternal.PropertyGridView.Refresh()
at System.Windows.Forms.PropertyGrid.Refresh(Boolean clearCached)
at System.Windows.Forms.PropertyGrid.set_SelectedObjects(Object[] value)
at System.Windows.Forms.PropertyGrid.set_SelectedObject(Object value)
at DVAMC.RoomDetailsForm.set_RoomDetailsSelectedRoom(Room value) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\RoomDetailsForm.cs:line 115
at DVAMC.RoomDetailsForm.roomListTreeView_SelectionChanged(Object sender, EventArgs e) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\RoomDetailsForm.cs:line 159
at BrightIdeasSoftware.ObjectListView.OnSelectionChanged(EventArgs e)
at BrightIdeasSoftware.ObjectListView.HandleApplicationIdle(Object sender, EventArgs e)
at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle(Int32 grfidlef)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at DVAMC.RoomDetailsCmd.Execute(ExternalCommandData commandData, String& message, ElementSet elements) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\RoomDetailsCmd.cs:line 44
InnerException:
Le dernier élément de la pile des points de trace de mon BuildingTypeConverter.GetStandardValuesSupported() méthode qui est indiqué ci-dessous.
GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context)
{
Room r = (Room)context.Instance; //this is line 14 referenced by the InvalidCastException's stack trace
if (r.IsLinked)
{
return true;
}
else
{
return false;
}
}
Maintenant, si j'ai mis un point d'arrêt à la ligne 14 ci-dessus et essayez de déboguer le débogueur ne casse pas au point d'arrêt.En plus, si j'ajoute du code arbitraire avant la fonte de la trace de la pile de la InvalidCastException semble toujours référence à la première ligne de GetStandardValues() indépendamment de ce qu'il est.Pour exemple, j'ai essayé le suivant.
public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context)
{
string s = "hello world"; //FIRST LINE
int i = 0;
Room r = (Room)context.Instance;
.....
J'ai toujours le même InvalidCastException.Pourtant, c'est la trace de pile de référence de la première ligne ci-dessus où j'initialise string s
.En outre, si j'ai essayé de définir un point d'arrêt sur cette première ligne, il n'est pas déclenché.
Comme je l'ai dit avant ce a fonctionne très bien un jour ou deux auparavant.J'ai même essayé de restauration des révisions précédentes, dans mon dépôt SVN.Je suis allé aussi loin que la première révision ont été, j'ai créé la coutume du Descripteur de Type de classe, mais encore fonctionner dans le problème avec la InvalidCastExceptions
.Quelqu'un aurait-il une idée de ce qui se passe?
La solution
Si la trace de la pile indique toujours la même ligne, même après avoir changé le code qui m'indiquent que le ProperyGrid ne fonctionne pas de la même version de l'assembly.Ceci est confirmé quand vous dites que vous mettez un point d'arrêt, mais le point d'arrêt n'est jamais atteint.Si vous exécutez l'intérieur du débogueur de Visual Studio, je vous suggère de regarder la fenêtre de sortie (Ctrl+W, O), qui liste tous les assemblages (avec leur chemin d'accès) qui sont chargés de les exécuter.J'ai vu la version de l'assembly confusion, en particulier lorsque l'assemblée est dans le cas, où il insiste sur le chargement d'une version plus ancienne de l'assemblée.
Autres conseils
Il se peut que les deux types sont en fait différents - par exemple, si l'un d'entre eux est chargé à partir d'une autre version de certains assemblée que l'autre type.Je ne suis pas sûr si cela pourrait se produire dans votre cas, mais ça pourrait être un problème.
La meilleure façon de vérifier cela est de placer un point d'arrêt à l'endroit où l'exception est levée.Ensuite, vous pouvez regarder les deux types de montres ou de fenêtre et de regarder o1.GetType().Assembly. FullName
(et de même pour l'autre objet).