سؤال

وأريد الحصول على نوع من كائن "BasePage" انني خلق. ويستند كل كائن الصفحة من BasePage. على سبيل المثال، لدي Login.aspx وفي التعليمات البرمجية الخلفية بلدي والفئة التي لديها العرض الأسلوب:

Display(BasePage page) {
    ResourceManager manager = new ResourceManager(page.GetType());
}

في هيكل مشروعي لدي ملف المورد الافتراضي وملف مورد الزائف الترجمة. إذا كنت تعيين محاولة شيء من هذا القبيل:

Display(BasePage page) {
    ResourceManager manager = new ResourceManager(typeof(Login));
}

وتقوم بإرجاع الصفحة المترجمة. بعد بعض البحث وجدت أن page.GetType (). ToString () عاد شيء لتأثير "ASP_login.aspx" كيف يمكنني الحصول على رمز الفعلي وراء نوع فئة، مثل أن أحصل على كائن من نوع "تسجيل الدخول" وهذا هو المستمدة من "BasePage"؟

ويرجع الفضل في ذلك مسبقا!

هل كانت مفيدة؟

المحلول

إذا رمز بجانب الخاص بك يبدو مثل هذا:

public partial class _Login : BasePage 
 { /* ... */ 
 }

وبعد ذلك سوف تحصل على الكائن Type لذلك مع typeof(_Login) . للحصول على نوع حيوي، يمكنك العثور عليها بشكل متكرر:

Type GetCodeBehindType()
 { return getCodeBehindTypeRecursive(this.GetType());
 }

Type getCodeBehindTypeRecursive(Type t)
 { var baseType = t.BaseType;
   if (baseType == typeof(BasePage)) return t;
   else return getCodeBehindTypeRecursive(baseType);
 }

نصائح أخرى

وبعد بعض البحوث إضافية وجدت أنه إذا أدعو Page.GetType (). BaseType تقوم بإرجاع رمز وراء نوع من صفحة aspx.

وpage.GetType (). وقد قيل BaseType من قبل، ولكن اسمحوا لي أن أوضح لماذا.

وصفحات ASPX ترث من التعليمات البرمجية الخلفية على صفحات، وهذا يعني أن التسلسل الهرمي الميراث يبدو مثل هذا:

...
Page
BasePage
Login
ASP_Login

وأين الجزء العلوي هو الأصل والقاع هو الطفل.

وهذا يسمح التعليمات البرمجية وراء لتكون في متناول من صفحة aspx، دون الحاجة إلى كل من الشفرة التي تم إنشاؤها المتعلقة صفحة aspx الفعلية الخاصة بك ليتم نسخها إلى صفحة الفئة الأساسية.

وهذا يعتمد حيث كنت تتصل العرض () من. إذا كنت اصفا اياه بانه من ASPX، ثم you'llse "ASP_login.aspx". إذا كنت استدعاء من التعليمات البرمجية الخلفية (أي في Page_Load () طريقة) يجب عليك الحصول على نوع صفحة تسجيل الدخول.

وبدلا من تمرير الصفحة في، هل يمكن أن تنظر فقط باستخدام الخاصية الصفحة (أي this.Page.GetType ()) التي ينبغي أن تكون دائما الحالي نوع الصفحة / codebehind، إذا لم تخني.

وأود أيضا أن جعل النقطة التي قد تفكر في نقل هذا النوع من الاشياء من ASPX / codebehind وإلى نوع من الخدمة. انها عموما فكرة جيدة لتقليل كمية من الأشياء التي تقوم بها في التعليمات البرمجية خلف، وبدلا من ذلك، دفع منطق في فئة مقدم واتباع نمط MVP للتنمية نماذج ويب ASP.NET.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top