كيفية الحصول على مثيل system.type من نوع الفصل العضو الثابت؟

StackOverflow https://stackoverflow.com/questions/1124124

  •  13-09-2019
  •  | 
  •  

سؤال

لدي خاصية ثابتة عامة في الفصل. يحتوي الفصل على بعض السمات المخصصة المطبقة على ذلك. أريد الوصول إلى السمة في خاصية ثابتة.

في عضو غير ثابت يمكنني الحصول على نوع الفئة الحالية باستخدام this.gettype () ولكن كيف أقوم بذلك في عضو ثابت في الفصل؟

يرجى ملاحظة أن ..

  • أنا لا أريد استخدام TypeOF (TypeName) بسبب قضايا الميراث. [سيكون لدي هذه الخاصية ورثت للفصول المشتقة.].

  • أنا أيضا لا أريد استخدام genercics. كذلك.

تعديل

هنا هدفي.

لدي فئة قاعدة مجردة تسمى EntityBase. جميع كياناتي تستمد من هذه الفئة. يحمل كل كيان أيضا سمة مخصصة تسمى TableMappingTattribute التي تتيح لي أن أعرف الجدول الذي يشير / خرائط إليه، أثناء وقت التشغيل. لدي بالفعل عقار في EntityBase الذي يعيدني إلى TableName المعين للكيان.

سأحتاج دائما إلى مثيل كيانا للوصول إلى خاصية TableName. أود الوصول إلى هذه الخاصية بشكل ثابت في وقت ما، مثل Simentity.tablename. لدي كيانات كبيرة في مشروعي. أريد إضافة هذه الخاصية الثابتة في فئة EntityBase نفسها. لذلك يجب أن أكتشف النوع في وقت التشغيل. كيف أفعل هذا في فئة EntityBase نفسها؟

thnaks.

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

المحلول

لا يمكنك، أساسا. نوع من(...) يكون ما تحتاج إلى استخدامه.

ضع في اعتبارك أنه إذا حاولت استخدام:

Type type = MyDerivedType.SomeStaticProperty;

الذي أعلن في MyBaseType, ، سوف ينتهي ذلك في الواقع إلى تجميعها

Type type = MyBaseType.SomeStaticProperty;

على أي حال. الأعضاء الثابتة أساسا ليست متعددة الجنس. إذا حاولت استخدامها تعدد الأشكال، فسوف تعمل في مشاكل مثل هذا.

تحرير: إذن من تحريرك، يبدو أنك تحاول أن تفعل بالضبط نوع الشيء أعلاه، مع

MyEntity.TableName

بدلا من

EntityBase.TableName

انها فقط لن تعمل. سيقوم برنامج التحويل البرمجي باعتماد التعليمات البرمجية لجلب EntityBase.tablename. وقت التشغيل ليس لديه مفهوم "الفئة الحالية". لا يوجد سياق هنا.

تحتاج أساسا إلى تغيير التصميم الخاص بك. إذا كنت ترغب في استخدام الميراث، فقد ترغب في الحصول على تسلسل هرمي متوازي - واحدة للبيانات الوصفية (أشياء مثل أسماء الجدول) وواحدة للكائنات الفعلية. لذلك سيكون لديك شيء مثل:

public class MyEntity : EntityBase<MyEntityType>

حيث تستمد Synentityype من Entitytype في التسلسل الهرمي الموازي. ثم أنت يمكن استخدام الميراث داخل التسلسل الهرمي الوصفية.

بدلا من ذلك، فقط جعل EntityBase Generic على أي حال، سيسمح لك بالحصول على نوع الكيان الذي تتحدث عنه:

public class MyEntity : EntityBase<MyEntity>

أعلم أنك قلت أنك لا ترغب في استخدام الأجهزة، ولكن بما تريد القيام به فقط لن يعمل، يجب عليك النظر فيه على الأقل ...

نصائح أخرى

لا أريد استخدام TypeOf (TypeName) بسبب مشكلات الوراثة.

خصائص ثابتة لا ورثت بالمعنى الطبيعي. بالتأكيد، فهي في النطاق، ولكن هذا ليس هو نفسه. الطريقة الوحيدة للحصول على ما تريد أن تنظر إلى إطار المكدس، ولكن هذا قبيح ومخربخ (والمحفوف بالمخاطر إذا تم تمكين التفاوضات).

أود إعادة المرسل للحل الذي يستخدم Interace ... المثيل لديك Type.

يمكنك استعمال ال System.Diagnostics.StackFrame فئة في طريقة ثابتة مثل هذا:

StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;

لا داعي للقلق بشأن الميراث إذا كان العقار static; ؛ لا يمكن تجاوزه، لذلك سيتم الإعلان عنها دائما في الفئة الأساسية على أي حال. استخدام typeof هي الطريق للذهاب.

إذا كنت لا ترغب في استخدام TypeOf ()، فأنت من التوفيق، لأن هذه هي الطريقة الوحيدة للحصول على كائن النوع من فئة ثابتة (ما لم تكن ترغب في العثور على الكتابة عن طريق الاتصال حسب نوع الاتصال. ابحث عنها بالاسم)

أنا لا أرى المشكلة مع الميراث رغم ذلك.

Type type = typeof(YourStaticClass);

Attribute[] attributes = type.GetCustomAttributes(...);

لا يعرف أحد الوالدين كم عدد الأطفال. لكن الطفل يعرف عن والديه. الطريقة الوحيدة يجب أن يعرف الوالد عن الطفل من خلال تعدد الأشكال التي ليست سمة من الأعضاء الثابتة.

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

public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
   Type type = childsObjectWrappedInBaseReference.GetType();
   ....
   ....
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top