Резюме: Null возвращается после того, как базовый класс добавлен к производному классу. Тем не менее, объект базового класса кажется ОК до кастинга.
Детали: Я переписываю старое приложение asp.net WebForms, чтобы иметь возможность расширять его с помощью подхода MVC. В рамках процессов я конвертирую проект веб-сайта в проект веб-приложения. В этом случае класс ProfileCommon
не генерируется автоматически. Итак, я скопировал определение автогенерированного класса из более старого проекта и поместил его как utils\ProfileCommon.cs
. Содержимое файла (упрощено до одного свойства, которое также было переименовано из чешского эквивалента):
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)));
}
}
}
Разница также в том, что я удалил virtual
из метода GetProfile()
и сделал его static
. (ProfileBase
не имеет метода GetProfile()
, поэтому должно быть хорошо, правильно?)
Код компилируется отлично. Тем не менее, я могу наблюдать в браузере (свободно переведенный, номера строк не совпадают с примером):
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
При отладке ProfileBase.Create(username)
возвращает объект, где правильное значение для свойства Name
имеет ожидаемое значение (отладчик знает, как получить значение). Тем не менее, после трансляции результирующая ссылка объекта null
. (Я должен признать, что я не очень хорош в С#, я пришел из С++.) Я также попытался разделить эту команду, чтобы получить ProfileBase p = ProfileBase.Create(username);
(объект не является нулевым), и только затем передать его в ProfileCommon q = p as ProfileCommon;
(значение q
равно нулю).
Обновление: Странно. Я переименовал свой класс в ProfileComm
, очистил проект, скомпилированный с нуля. В каталоге нет строки ProfileCommon
(а не в источниках, а не в двоичных файлах, *.suo, *.dll, *.pdb, а не в любом другом файле). Даже имя файла было переименовано в ProfileComm.cs
, чтобы не иметь ProfileCommon
в *.csproj. Источник GetProfile()
был изменен на:
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));
}
}
Теперь информация об исключении в браузере читается (переводится с другого языка): System.InvalidCastException: Object of the type ProfileCommon cannot be casted to the type proj_app.utils.ProfileComm.
При отладке отладчик показывает, что тип p
равен ProfileCommon
:
Я понятия не имею, откуда произошло имя типа ProfileCommon
. Может ли быть связано с версией .NET framework? Что я должен проверить? Может ли класс ProfileCommon
по-прежнему генерировать динамически каким-то образом?