2015-07-08 18 views
12

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:

What the debugger shows about the type

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?

+2

'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

+0

@DLeh: ho rinominato la mia classe per scoprirlo. Per favore, vedi l'aggiornamento alla fine della domanda. – pepr

risposta

2

ASP.NET crea automaticamente una classe che eredita da ProfileCommon ProfileBase all'avvio dell'applicazione. Se si desidera utilizzare l'implementazione del proprio profilo, è necessario specificarlo esplicitamente in web.config. Qualcosa di simile:

<profile inherits="proj_app.utils.ProfileCommon"> 
.... 

In questo modo ProfileBase.Create restituirà un'istanza del tipo specificato, invece di generato automaticamente uno.

MSDN for more details

+0

@pepr, non è necessario rinominare la classe. Basta applicare la configurazione che ho mostrato nella mia risposta al tuo web.config. In caso contrario, ASP.NET non sa quale classe profilo creare e, per impostazione predefinita, viene creata automaticamente una. –

+0

Grazie Vitalij! Non ho dato abbastanza consigli per l'attenzione. Спасибо и всего хорошего! Correzione – pepr

+0

... "prima il tuo consiglio" – pepr

6

Sembra che siano disponibili due tipi di ProfileCommon per verificare la fonte. Potresti anche essere più specifico e avere ProfileBase.Create(username) restituire proj_app.utils.ProfileCommon anziché solo ProfileCommon.

anche per il debug magari provare e vedere quello che il compilatore pensa che l'oggetto è davvero, vedi questo post: Could not resolve type: Issue while I am casting a custom class in c#


Sembra che stai in conflitto con una classe ASP.NET, mi piacerebbe creare sia una nuova classe interamente o creare una super classe della classe ProfileCommon di ASP.NET.

ASP.NET utilizza la classe ProfileBase per creare la classe utilizzata per il profilo utente. Quando viene avviata un'applicazione con il profilo utente abilitato, ASP.NET crea una nuova classe di tipo ProfileCommon, che eredita dalla classe ProfileBase. Gli accessori fortemente tipizzati vengono aggiunti alla classe ProfileCommon per ogni proprietà definita nella sezione di configurazione del profilo. Gli accessori fortemente digitati della classe ProfileCommon chiamano i metodi GetPropertyValue e SetPropertyValue della classe base ProfileBase per recuperare e impostare i valori delle proprietà del profilo, rispettivamente. Un'istanza della classe ProfileCommon viene impostata come valore della proprietà Profile per l'applicazione ASP.NET.

https://msdn.microsoft.com/en-us/library/system.web.profile.profilebase(v=vs.110).aspx

+0

Buon punto. Per scoprirlo, ho ribattezzato la classe. 'ProfileCommon' non si trova nelle origini ora né nei binari. Tuttavia, viene restituito in qualche modo dal 'ProfileBase.Create()'. Per favore, vedi la parte di aggiornamento della domanda. – pepr

+0

Sembra sciocco, ma prova una pulizia completa e ricostruisci potresti avere un file temporaneo da qualche parte. Se ciò non funziona, proverò a pensare ad alcuni suggerimenti migliori. Puoi anche usare i moduli di debug> per vedere quali simboli vengono caricati in fase di esecuzione –

+1

Ho provato a pulire il più possibile. Sto spogliando il progetto ora a nudo per pubblicare il vero esempio. – pepr

Problemi correlati