This article was translated by machine. To view in the article in English, select the English check box. You can also display the English text in a popup window by moving the mouse pointer over the text.
الترجمة
الأصلي
This documentation is archived and is not being maintained.

Type.MakeGenericType أسلوب

Visual Studio 2010

استبدال العناصر في صفيفة للمعلمات نوع من أنواع تعريف النوع العام الحالي و إرجاع Typeكائن يمثل الناتج نوع constructed.

مساحة الاسم:  System
التجميع:  mscorlib (في mscorlib.dll)

public virtual Type MakeGenericType(
	params Type[] typeArguments
)

المعلمات

typeArguments
النوع: System.Type[]
صفيفة أنواع إلى أن يتم استبداله معلمات نوع من النوع العام الحالي.

القيمة المُرجعة

النوع: System.Type
Type يمثل نوع constructed تشكيل بواسطة استبدال العناصر typeArgumentsلمعلمات النوع الحالي نوع عام.

استثناء:شرط
InvalidOperationException

النوع الحالي لا يمثل تعريف نوع عام. That هو, IsGenericTypeDefinition إرجاع false.

ArgumentNullException

typeArgumentsهوnull.

-أو-

أي عنصر من typeArgumentsهو null.

ArgumentException

عدد العناصر في typeArgumentsليس هو نفسه كـ عدد نوع المعلمات في الحالي نوع عام تعريف.

-أو-

أي عنصر من typeArgumentsلا تفي بالقيود المحددة لمعلمة نوع الموافق الحالي نوع عام.

NotSupportedException

الأسلوب الذي تم استدعاؤه هو غير معتمدة في الفئة الأساسية. يجب أن توفر الفئات المشتقة من تطبيق.

MakeGenericType أسلوب يسمح لك إلى كتابة تعليمات برمجية التي يقوم بتعيين أنواع معينة إلى معلمات تعريف نوع عام، وبالتالي يتم إنشاء نوع Typeالكائن الذي يمثل أحد معين constructed النوع. يمكنك استخدام هذا Typeالكائن إلى إنشاء وقت التشغيل مثيلات نوع constructed.

إنشاء مع أنواع MakeGenericTypeيمكن فتح، التي هو، بعض من نوعها يمكن أن تكون الوسيطات نوع المعلمات من إحاطة الأساليب العامة أو الأنواع. قد تستخدم مثل فتح بناء أنواع عندما تقوم بإرسال التجميعات ديناميكي. على سبيل المثال، ضع في الاعتبار فئات Baseو "Derivedفي تعليمات برمجية التالية."


public class Base<T, U> { }
public class Derived<V> : Base<int, V> { }


لإنشاء Derivedفي تجميع حيوي، فإنه هو الضرورية لبناء به نوع أساسي. إلى للقيام بذلك، قم باستدعاء MakeGenericTypeالأسلوب تشغيل Typeالكائن الذي يمثل الفئة Base، باستخدام وسيطات نوع عام Int32ومعلمة نوع Vمن Derived. نظراً لأنواع و معلمات نوع عامة كلاهما تمثلها Typeعلى الكائنات، يمكن تمرير صفيفة يحتوي على كل منهما إلى MakeGenericTypeالأسلوب.

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

constructed اكتب مثل Base<int, V>هو باعث مفيدة عندما تعليمات برمجية، ولكن لا يمكنك استدعاء MakeGenericTypeأسلوب هذا النوع لأنه ليس من تعريف نوع عام. لإنشاء نوع constructed مغلق الذي يمكن أن يكون إنشاء، أول استدعاء GetGenericTypeDefinitionطريقة للحصول على Typeالكائن الذي يمثل في تعريف النوع العام وقم باستدعاء MakeGenericTypeباستخدام وسيطات النوع المطلوب.

Type إرجاع كائن بواسطة MakeGenericTypeهو نفسه كـ Typeتم الحصول عليها من خلال الاتصال GetTypeأسلوب الناتج عن عملية الدمج بإنشاء نوع، أو GetTypeالطريقة أي بناء اكتب w ذلك كـ إنشاؤه من تعريف النوع العام نفس استخدام نفس نوع الوسيطات.

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

صفيفة أنواع العامة هو نفسه لا اكتب عام. لا يمكنك يتصل MakeGenericTypeتشغيل نوع صفيفة مثل C<T>[](Dim ac() As C(Of T)في Visual أساسى). لإنشاء نوع عام مغلق من C<T>[]، باستدعاء GetElementTypeللحصول تشغيل تعريف النوع العام C<T>؛ استدعاء MakeGenericTypeفي تعريف النوع العام لإنشاء نوع constructed؛ وأخيراً قم باستدعاء MakeArrayTypeالأسلوب تشغيل نوع constructed لإنشاء نوع الصفيف. نفس هو حقيقية لأنواع المؤشرات و refأنواع ( ByRefفي Vهوual الأساسية).

للحصول على قائمة من الشروط ثابتة للمصطلحات المستخدمة في الانعكاس العام، راجع ملاحظات خاصيةIsGenericType .

الأنواع المتداخلة

إذا كان نوع عام هو تعريف استخدام C# C + + أو Vهوual أساسي، ثم به المتداخلة أنواع كل عام. Th هو هو صحيح حتى ولو أنواع متداخلة لا يوجد نوع المعلمات الخاصة بهم، بحيث تضمين الجميع اللغات الثلاثة معلمات نوع إحاطة الأنواع في lهوts معلمة نوع من أنواع المتداخلة. خذ بعين الاعتبار فئات التالية:


public class Outermost<T>
{
    public class Inner<U>
    {
        public class Innermost1<V> {}
        public class Innermost2 {}
    }
}


قائمة معلمة نوع فئة متداخلة Innerله نوع معلمتين، Tو U، الأولى منها هي معلمة نوع من class. المضمنة الخاصة به وبشكل مماثل، نوع معلمة قائمة فئة متداخلة Innermost1يحتوي على معلمات نوع الثلاثة، T، U، و V، مع Tو Uقادمة من إحاطة به فئات. الفئة المتداخلة Innermost2له نوع معلمتين، Tو U، التي تأتي من إحاطة به فئات.

إذا كان نوع إرفاق قائمة المعلمة معلمة نوع واحد أو المزيد، الجميع معلمات نوع حتى يتم مُضمن في القائمة نوع معلمة من النوع المتداخل.

إلى إنشاء نوع عام من تعريف النوع العام لنوع متداخل، قم باستدعاء MakeGenericTypeيتكون أسلوب مع الصفيفة concatenating صفائف وسيطة نوع الجميع أنواع إحاطة، بدءاً من النوع العام الأكثر أهمية، والنهايات مع صفيفة نوع وسيطة نوع متداخل نفسه، إذا لم يكن معلمات نوع الخاصة بها. لإنشاء مثيل ل Innermost1، اتصل MakeGenericTypeالطريقة مع صفيفة يحتوي على ثلاثة أنواع، أن تعيين إلى أ، ع، و V. لإنشاء مثيل ل Innermost2، اتصل MakeGenericTypeأسلوب صفيف يحتوي على اثنين أنواع، يجب تعيينه إلى T و U.

اللغات التي تنشر معلمات نوع إحاطة الأنواع في هذا الشكل بحيث يمكنك استخدام معلمات نوع نوع إرفاق إلى تحديد حقول أنواع المتداخلة. وإلا، لن يكون نوع المعلمات في نطاق ضمن النصوص الأساسية لمتداخله أنواع. هو المحتملة لتعريف أنواع المتداخلة دون نشر معلمات نوع إحاطة الأنواع، بباعث تعليمات برمجية في تجميعات ديناميكي أو باستخدام Ilasm.exe ( المجمع MSIL). خذ بعين الاعتبار ما يلي تعليمات برمجية ل المجمع MSIL:

.class public Outer<T> {
    .class nested public Inner<U> {
        .class nested public Innermost {
        }
    }
}

في ترتيب هو المثال، هو لا يمكن تعريف حقل من نوع Tأو Uفي فئة Innermost، لأن هذه المعلمات من نوع غير موجودة في نطاق. التعليمة البرمجية المجمع التالية بتعريف فئات المتداخلة التي تتصرف بالطريقة يفعلون إذا المعرفة في C + + و Visual أساسى و C#:

.class public Outer<T> {
    .class nested public Inner<T, U> {
        .class nested public Innermost<T, U, V> {
        }
    }
}

يمكنك استخدام Ildasm.exe (المفكك MSIL)إلى فحص الفئات المتداخلة في اللغات عالية المستوى ولاحظ هذا نظام التسمية.

يستخدم المثال التالي MakeGenericTypeأسلوب إلى إنشاء نوع constructed من تعريف نوع عام Dictionary<TKey, TValue>النوع. يمثل نوع constructed Dictionary<TKey, TValue>من Testالكائنات التي تحتوي على سلسلة المفاتيح.


using System;
using System.Reflection;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        Console.WriteLine("\r\n--- Create a constructed type from the generic Dictionary type.");

        // Create a type object representing the generic Dictionary 
        // type, by omitting the type arguments (but keeping the 
        // comma that separates them, so the compiler can infer the
        // number of type parameters).      
        Type generic = typeof(Dictionary<,>);
        DisplayTypeInfo(generic);

        // Create an array of types to substitute for the type
        // parameters of Dictionary. The key is of type string, and
        // the type to be contained in the Dictionary is Test.
        Type[] typeArgs = { typeof(string), typeof(Test) };

        // Create a Type object representing the constructed generic
        // type.
        Type constructed = generic.MakeGenericType(typeArgs);
        DisplayTypeInfo(constructed);

        // Compare the type objects obtained above to type objects
        // obtained using typeof() and GetGenericTypeDefinition().
        Console.WriteLine("\r\n--- Compare types obtained by different methods:");

        Type t = typeof(Dictionary<String, Test>);
        Console.WriteLine("\tAre the constructed types equal? {0}", t == constructed);
        Console.WriteLine("\tAre the generic types equal? {0}", 
            t.GetGenericTypeDefinition() == generic);
    }

    private static void DisplayTypeInfo(Type t)
    {
        Console.WriteLine("\r\n{0}", t);

        Console.WriteLine("\tIs this a generic type definition? {0}", 
            t.IsGenericTypeDefinition);

        Console.WriteLine("\tIs it a generic type? {0}", 
            t.IsGenericType);

        Type[] typeArguments = t.GetGenericArguments();
        Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
        foreach (Type tParam in typeArguments)
        {
            Console.WriteLine("\t\t{0}", tParam);
        }
    }
}

/* This example produces the following output:

--- Create a constructed type from the generic Dictionary type.

System.Collections.Generic.Dictionary`2[TKey,TValue]
        Is this a generic type definition? True
        Is it a generic type? True
        List type arguments (2):
                TKey
                TValue

System.Collections.Generic.Dictionary`2[System.String, Test]
        Is this a generic type definition? False
        Is it a generic type? True
        List type arguments (2):
                System.String
                Test

--- Compare types obtained by different methods:
        Are the constructed types equal? True
        Are the generic types equal? True
 */


نظام التشغيل Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, الإصدار x64 من نظام التشغيل Windows XP Professional, Windows XP Starter Edition, Windows Server 2008, نظام التشغيل Windows Server 2003, نظام التشغيل Windows Server 2000 المزود بحزمة الخدمة SP4, نظام التشغيل Windows Millennium Edition, نظام التشغيل Windows 98, Xbox 360, Zune

لا يدعم .NET Framework و .NET Compact Framework كافة الإصدارات الخاصة بكل نظام أساسي. للحصول على قائمة بالإصدارات المدعمة، راجع متطلبات النظام إطار عمل .NET.

.NET Framework

مدعوم في: 4, 3.5, 3.0, 2.0

NET Framework. Client Profile

مدعوم في: 4

XNA Framework

مدعوم في: 3.0, 2.0, 1.0
إظهار: