Sommario: Il valore Null viene restituito dopo il cast della classe base alla classe derivata. Tuttavia, l'oggetto della classe base sembra essere OK prima del casting.ProfileCommon - la trasmissione in fase di esecuzione non riesce
Dettagli: Sto riscrivendo l'applicazione asp.net WebForms più vecchia per poterlo estendere utilizzando l'approccio MVC. Come parte del processo, sto convertendo il progetto del sito Web nel progetto di applicazione Web. Nel caso, la classe ProfileCommon
non viene generata automaticamente. Quindi, ho copiato la definizione di classe generata automaticamente dal vecchio progetto e l'ho inserita come utils\ProfileCommon.cs
. Contenuto del file (semplificato a una singola proprietà che è stata anche ribattezzata dalla equivalente Repubblica):
using System;
using System.Web;
using System.Web.Profile;
namespace proj_app.utils
{
public class ProfileCommon : System.Web.Profile.ProfileBase
{
public virtual string Name {
get { return ((string)(this.GetPropertyValue("Name"))); }
set { this.SetPropertyValue("Name", value); }
}
public static ProfileCommon GetProfile(string username)
{
return ((ProfileCommon)(ProfileBase.Create(username)));
}
}
}
La differenza è che anche io ho tolto il virtual
dal metodo GetProfile()
e ne ha fatto static
. (Il ProfileBase
non ha il metodo GetProfile()
, quindi, dovrebbe andare bene, giusto?)
Il codice si compila bene. Tuttavia, posso osservare quanto segue nel browser (liberamente tradotto, numeri di riga non corrispondono con l'esempio):
The object of the ProfileCommon type cannot be casted to proj_app.utils.ProfileCommon.
Description: ... unhandled exception during the web request...
Details about the exception: The object of the ProfileCommon type cannot be casted to proj_app.utils.ProfileCommon.
Zdrojová chyba:
Line 36: public static ProfileCommon GetProfile(string username)
Line 37: {
Line 38: return ((ProfileCommon)(ProfileBase.Create(username)));
Line 39: }
Line 40: }
Source file: d:\__RizeniProjektu\aplikace\proj_app\utils\ProfileCommon.cs Line: 38
Stack trace:
[InvalidCastException: Objekt typu ProfileCommon nelze přetypovat na typ proj_app.utils.ProfileCommon.]
proj_app.utils.ProfileCommon.GetProfile(String username) in d:\__RizeniProjektu\aplikace\proj_app\utils\ProfileCommon.cs:38
Users_seznam.Page_Load(Object sender, EventArgs e) in d:\__RizeniProjektu\aplikace\proj_app\Users\seznam.aspx.cs:29
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772
Quando il debug, la ProfileBase.Create(username)
restituisce l'oggetto, in cui il valore corretto per la proprietà Name
ha la valore atteso (il debugger sa come ottenere il valore). Tuttavia, dopo il cast, il riferimento all'oggetto risultante è null
. (Devo ammettere che non sono molto bravo in C#; sono venuto dal C++.) Ho provato anche a dividere il comando per ottenere il ProfileBase p = ProfileBase.Create(username);
(l'oggetto non è nullo), e solo dopo per castarlo a ProfileCommon q = p as ProfileCommon;
(il q
è zero).
Aggiornamento: Strano. Ho rinominato la mia classe in ProfileComm
, ho pulito il progetto, compilato da zero. Non c'è una stringa ProfileCommon
nella directory (né nei sorgenti, non nei file binari, * .suo, * .dll, * .pdb, non in qualsiasi altro file). Anche il nome file è stato rinominato in ProfileComm.cs
per non avere il ProfileCommon
in * .csproj. La fonte della GetProfile()
è stato cambiato in:
public class ProfileComm : System.Web.Profile.ProfileBase
{
...
public static ProfileComm GetProfile(string username)
{
object p = ProfileBase.Create(username);
Type t = p.GetType();
string s = t.Name;
return ((ProfileComm)(p));
}
}
Ora i dettagli di eccezione nel browser lettura (tradotte da un'altra lingua): System.InvalidCastException: Object of the type ProfileCommon cannot be casted to the type proj_app.utils.ProfileComm.
Quando il debug, il debugger indica che il tipo di p
è ProfileCommon
:
non ho idea da dove il nome del tipo ProfileCommon
avanza Potrebbe essere rela. fare una versione del framework .NET? Cosa dovrei controllare? La classe ProfileCommon
potrebbe essere generata in qualche modo dinamicamente?
'oggetto del tipo ProfileCommon non può essere colato a proj_app.utils.ProfileCommon', hai il proprio oggetto chiamato' ProfileCommon'? sei sicuro di voler scegliere quello giusto? – DLeh
@DLeh: ho rinominato la mia classe per scoprirlo. Per favore, vedi l'aggiornamento alla fine della domanda. – pepr