सारांश: बेस क्लास को व्युत्पन्न कक्षा में कास्ट करने के बाद वापस लौटाया जाता है। हालांकि, कास्टिंग से पहले बेस क्लास ऑब्जेक्ट ठीक है।प्रोफाइलकॉम - रन-टाइम में कास्टिंग
विवरण: मैं पुराने एएसपीनेट वेबफॉर्म एप्लिकेशन को फिर से लिख रहा हूं ताकि एमवीसी दृष्टिकोण का उपयोग करके इसे विस्तारित किया जा सके। प्रोसेस के एक हिस्से के रूप में, मैं वेब साइट प्रोजेक्ट को वेब एप्लिकेशन प्रोजेक्ट में परिवर्तित कर रहा हूं। मामले में, 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)));
}
}
}
अंतर भी है कि मैं GetProfile()
विधि से virtual
हटा दिया है और यह 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);
(ऑब्जेक्ट शून्य नहीं है) प्राप्त करने के लिए कमांड को विभाजित करने का प्रयास किया, और केवल इसे प्रोफ़ाइल कॉमॉन q = p as ProfileCommon;
(q
) पर डालने के लिए शून्य है)।
अद्यतन: अजीब। मैंने अपनी कक्षा का नाम बदलकर ProfileComm
कर दिया है, स्क्रैच से संकलित परियोजना को साफ़ किया है। निर्देशिका में ProfileCommon
स्ट्रिंग नहीं है (न ही सूत्रों में, बाइनरी फ़ाइलों में नहीं, * .suo, * .dll, * .pdb, किसी अन्य फ़ाइल में नहीं)। यहां तक कि फ़ाइल नाम का नाम बदलकर ProfileComm.cs
कर दिया गया था, जो * .csproj में ProfileCommon
नहीं है।
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));
}
}
अब ब्राउज़र को पढ़ने में अपवाद का विवरण (किसी अन्य भाषा से अनुवाद): GetProfile()
के स्रोत में बदल गया था System.InvalidCastException: Object of the type ProfileCommon cannot be casted to the type proj_app.utils.ProfileComm.
जब डीबगिंग, डिबगर पता चलता है कि p
के प्रकार ProfileCommon
है:
मैं कहाँ प्रकार का नाम ProfileCommon
में फिसल से पता नहीं है यह असली हो सकता है। टेड .NET ढांचे का एक संस्करण करते हैं? मुझे क्या जांचना चाहिए? ProfileCommon
कक्षा अभी भी गतिशील रूप से उत्पन्न हो सकती है?
'ProfileCommon प्रकार की वस्तु proj_app.utils.ProfileCommon' लिए casted नहीं किया जा सकता, आप अपने खुद वस्तु' ProfileCommon' नामित किए हैं? क्या आप वाकई सही पर कास्टिंग कर रहे हैं? – DLeh
@DLeh: मैंने अपनी कक्षा का नाम बदलने के लिए इसका नाम बदल दिया है। कृपया, प्रश्न के अंत में अद्यतन देखें। – pepr