أنواع و عام انعكاس

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

There are الثاني مفاتيح إلى understanding how انعكاس handles generic أنواع و وظائف:

  • The نوع معلمات of generic نوع ملفات تعريف و generic أسلوب ملفات تعريف are represented بواسطة instances of the Type فئة.

    ملاحظةملاحظة

    Many خصائص و وظائف of Type have different سلوك when a Type كائن represents a معلمة نوع عام. These differences are documented في the خاصية و أسلوب topics.For مثال, see IsAutoClass و DeclaringType. بالإضافة إلى بعض الأعضاء الصالحة فقط عند Typeكائن يمثل عام نوع معلمة.For مثال, seeGetGenericTypeDefinition.

  • في حالة وجود مثيل ل Typeيمثل نوع عام، ثم يشتمل صفيفة الأنواع التي تمثل معلمات نوع (بالنسبة لتعريفات نوع عام) أو وسيطات نوع (أنواع constructed). نفس هو صحيحاً لمثيل MethodInfoالفئة التي تمثل الأسلوب العام.

يوفر انعكاس وظائف Typeو MethodInfoالتي تسمح لك بالوصول إلى صفيفة نوع معلمة s، لتحديد ما إذا كان مثيل Typeيمثل نوع معلمة أو على نوع الفعلي.

ل مثال تعليمات برمجية demonstrating الأساليب التي تمت مناقشتها هنا، راجع كيفية القيام بما يلي: قم بفحص و إنشاء مثيل لأنواع عامة مع انعكاس.

يفترض المناقشة التالية إمكانية مع المصطلحات عام، مثل الفرق بين معلمات نوع ووسيطات وبناء مفتوح أو مغلق أنواع. لمزيد من المعلومات، راجع generics في .NET Framework.

تتكون هذه النظرة العامة من الأقسام التالية:

  • هو Th هو نوع عام أو أسلوب؟

  • إنشاء أنواع مغلق عام

  • فحص وسيطات النوع و معلمات نوع

  • invariants

  • مواضيع ذات صلة

هو Th هو نوع عام أو أسلوب؟

عند استخدام الانعكاس للتحقق من نوع غير معروف، بتمثيل بواسطة مثيل Type، استخدم IsGenericTypeخاصية لتحديد ما إذا كانت معروفة كتابة هو عام. تقوم بإرجاع trueإذا كان النوع هو عام. وبالمثل، عند فحص أسلوب غير معروف، يمثله مثيل MethodInfoالفئة، استخدم IsGenericMethodالخاصية لتحديد ما إذا كان الأسلوب هو عام.

هذا هو عام نوع أو تعريف أسلوب؟

استخدام IsGenericTypeDefinitionخاصية لتحديد ما إذا كان Typeكائن يمثل عام نوع التعريف، واستخدام IsGenericMethodDefinitionطريقة لتحديد ما إذا كان MethodInfoيمثل تعريف الأسلوب العام.

نوع عام و أسلوب هي ملفات تعريف القوالب التي يتم تاريخ الإنشاء أنواع instantiable. الأنواع العامة في إطار عمل.NET فئة المكتبة، مثل Dictionary<TKey, TValue>، ملفات تعريف نوع عام.

هو نوع أو أسلوب فتح أو مغلق؟

نوع عام أو الأسلوب هو إغلاق إذا كان قد تم استبدال أنواع instantiable من أجل الجميع به نوع المعلمات، بما في ذلك الجميع معلمات نوع من الجميع الأنواع المضمنة. يمكنك إنشاء مثيل لنوع عام فقط إذا كان ذلك هو مغلق. Type.ContainsGenericParametersتقوم خاصية بإرجاع trueإذا كان نوع هو. افتح أسلوب s، MethodInfo.ContainsGenericParametersأسلوب تنفيذ نفس الوظيفة.

العودة إلى الأعلى

إنشاء أنواع مغلق عام

بعد الحصول على نوع عام أو تعريف الأسلوب، استخدم MakeGenericTypeأسلوب إلى إنشاء نوع عام مغلق أو MakeGenericMethodأسلوب إلى إنشاء MethodInfoلمغلق الأسلوب العام.

الحصول على نوع عام أو تعريف أسلوب

إذا كان لديك نوع عام مفتوح أو الأسلوب الذي هو ليس لنوع عام أو تعريف الأسلوب، إمكانية إنشاء مثيلات لها ولا يمكن استخدام المعلمات نوع mهوsing. يجب أن يكون لديك نوع عام أو أسلوب تعريف. استخدام GetGenericTypeDefinitionأسلوب إلى الحصول على تعريف نوع عام أو GetGenericMethodDefinitionأسلوب إلى الحصول على تعريف الأسلوب العام.

على سبيل المثال، إذا كان لديك (Typein Visual أساسى) وتريد إلى إنشاء النوعDictionary<int, string>الكائن الذي يمثلDictionary(Of Integer, String) Dictionary<string, MyClass>، التي يمكنك استخدامها GetGenericTypeDefinitionأسلوب إلى الحصول على Typeيمثل Dictionary<TKey, TValue>ثم استخدم MakeGenericTypeأسلوب إلى إنتاج Typeيمثل Dictionary<int, MyClass>.

على سبيل مثال من عامة مفتوحة كتابته هو عام لا اكتب، راجع "نوع معلمة أو نوع وسيطه" لاحقاً في ترتيب هو الموضوع.

العودة إلى الأعلى

فحص وسيطات النوع و معلمات نوع

استخدام Type.GetGenericArgumentsأسلوب إلى الحصول على صفيفة من Typeالكائنات التي تمثل نوع المعلمات أو نوع وسيطات نوع عام، واستخدام MethodInfo.GetGenericArgumentsأسلوب إلى القيام بنفس الشيء على الأسلوب العام.

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

نوع معلمة أو نوع وسيطة

لتحديد ما إذا كان عنصر معين من الصفيف هو معلمة نوع أو على وسيطة "نوع"، استخدم IsGenericParameterخاصية. IsGenericParameterهو خاصية trueإذا كان العنصر هو معلمة نوع.

نوع عام يمكن فتحها دون أن تعريف نوع عام، في هذه الحالة له خليط وسيطات النوع و اكتب معلمات. على سبيل المثال، في التعليمة البرمجية التالية لفئة Dمشتقة من نوع انشئت بواسطة استبدال معلمة النوع أول من Dللمعلمة ثانية من نوع B.

class B<T, U> {}
class D<V, W> : B<int, V> {}
Class B(Of T, U)
End Class
Class D(Of V, W)
    Inherits B(Of Integer, V)
End Class
generic<typename T, typename U> ref class B {};
generic<typename V, typename W> ref class D : B<int, V> {};

إذا حصلت على Typeالكائن الذي يمثل D<V, W>واستخدام BaseTypeخاصية للحصول على نوعه الأساسي الناتج عن عملية الدمج type B<int, V>مفتوح، ولكن ليس من تعريف نوع عام.

المصدر من المعلمات العامة

عام نوع معلمة قد تأتي من النوع الذي يتم فحص من نوع إرفاق أو من أسلوب عام. يمكنك تحديد مصدر العام نوع معلمة كما يلي:

  • أولاً، قم باستخدام DeclaringMethodالخاصية إلى لتحديد ما إذا كانت معلمة نوع يأتي من الأسلوب العام. إذا كانت القيمة خاصية هو مرجع فارغ غير ( Nothingفي Vهوual الأساسية)، ثم المصدر هو الأسلوب العام.

  • إذا كان المصدر هو أسلوب غير عام، استخدام DeclaringTypeخاصية لتحديد نوع عام معلمة نوع عام ينتمي إليها.

إذا كانت معلمة نوع ينتمي إلى أسلوب عام، DeclaringTypeخاصية بإرجاع نوع التصريح بالأسلوب العام، الذي هو متعلقة.

موضع عام معلمة

في حالات نادرة، فإنه هو الضرورية لتحديد موضع معلمة نوع في lهوt معلمة نوع الفئة المعرف الخاص به. ل مثال، افترض أن لديك Typeيمثل الكائن B<int, V>نوع من يسبق مثال. GetGenericArgumentsتمنحك الطريقة قائمة وسيطات النوع، وعند فحص Vالتي يمكنك استخدامها DeclaringMethodو DeclaringTypeخصائص إلى اكتشاف الموقع يأتي من. ثم يمكنك استخدام GenericParameterPositionخاصية إلى تحديد موضعه في القائمة نوع معلمة الموقع تم تعريفه. في هذا مثال، Vهو الموضع 0 (صفر) في القائمة نوع معلمة الموقع تم تعريفه.

نوع الأساس وقيود واجهة

استخدام GetGenericParameterConstraintsأسلوب إلى الحصول على النوع الأساسي قيود قيد وواجهة لمعلمة نوع. ترتيب عناصر الصفيف هو غير هامة. عنصر يمثل قيد واجهة إذا كان ذلك هو نوع واجهة.

معلمة السمات العامة

GenericParameterAttributesيحصل خاصية GenericParameterAttributesالقيمة التي تشير إلى التباين (التباين المشترك أو contravariance) و قيود خاص معلمة نوع.

التباين المشترك و التشابه

لتقرر ما إذا كانت معلمة نوع هو متغير طردي أو متغير عكسي، قم بتطبيق GenericParameterAttributes.VarianceMaskقناع GenericParameterAttributesقيمة هو التي يتم إرجاعها بواسطة GenericParameterAttributesخاصية. إذا كان النتيجة GenericParameterAttributes.None، هو نوع معلمة invariant. انظر التباين و Contravariance في وقت تشغيل اللغة العامة

قيود خاص

لتحديد القيود الخاصة لمعلمة نوع، قم بيطبق GenericParameterAttributes.SpecialConstraintMaskقناع GenericParameterAttributesقيمة هو التي يتم إرجاعها بواسطة GenericParameterAttributesخاصية. إذا كانت النتيجة هو GenericParameterAttributes.None، لا توجد قيود خاص. يمكن أن تكون مقيدة بمعلمة نوع إلى نوع مرجع، يمكن إلى أن يكون نوع القيمة ذا ليست القيمة فارغة، و إلى يكون construcإلىr افتراضية.

العودة إلى الأعلى

invariants

للحصول على جدول الشروط الثابتة للمصطلحات عام في انعكاس لعام أنواع، راجع Type.IsGenericType. للمصطلحات الإضافية التي تتعلق إلى أساليب عامة، راجع MethodInfo.IsGenericMethod.

العودة إلى الأعلى

مواضيع ذات صلة

Title

الوصف

كيفية القيام بما يلي: قم بفحص و إنشاء مثيل لأنواع عامة مع انعكاس

يوضح كيفية استخدام الخصائص والأساليب الخاصة Typeو MethodInfoلفحص عام أنواع.

generics في .NET Framework

توضح هذه المقالة ميزة "عام" وكيف أنها هو المعتمدة في إطار عمل.NET.

كيفية القيام بما يلي: قم بتعريف نوع عام مع انعكاس حذف

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

عرض معلومات نوع

وصف Typeالفئة وتوفر أمثلة تعليمات برمجية التي توضح كيفية إلى استخدام Typeمع الفئات المختلفة للانعكاس إلى الحصول على معلومات حول construcإلىrs، وظائف، حقول والخصائص والأحداث.

العودة إلى الأعلى