Type.IsAssignableFrom(Type) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Bestimmt, ob eine Instanz des angegebenen Typs c
einer Variablen des aktuellen Typs zugewiesen werden kann.
public:
virtual bool IsAssignableFrom(Type ^ c);
public virtual bool IsAssignableFrom (Type? c);
public virtual bool IsAssignableFrom (Type c);
abstract member IsAssignableFrom : Type -> bool
override this.IsAssignableFrom : Type -> bool
Public Overridable Function IsAssignableFrom (c As Type) As Boolean
Parameter
- c
- Type
Der Typ, der mit dem aktuellen Typ verglichen werden soll.
Gibt zurück
true
, wenn eine der folgenden Bedingungen erfüllt ist:
c
und die aktuelle Instanz haben denselben Typ.c
ist entweder direkt oder indirekt von der aktuellen Instanz abgeleitet.c
wird direkt von der aktuellen Instanz abgeleitet, wenn es von der aktuellen Instanz erbt;c
wird indirekt von der aktuellen Instanz abgeleitet, wenn es von einer Folge von einer oder mehr Klassen erbt, die von der aktuellen Instanz erben.
– Die aktuelle Instanz ist eine Schnittstelle, die von c
implementiert wird.
c
ist ein generischer Typparameter, und die aktuelle Instanz stellt eine der Einschränkungen vonc
dar.c
stellt einen Werttyp dar, und die aktuelle Instanz stelltNullable < c >
(Nullable(Of c)
in Visual Basic).
false
, wenn keine dieser Bedingungen erfüllt sind oder wenn c
null
ist.
Implementiert
Beispiele
Im folgenden Beispiel wird die -Methode IsAssignableFrom
mit definierten Klassen, Ganzzahlarrays und Generics veranschaulicht.
using namespace System;
using namespace System::Collections::Generic;
ref class Room
{
};
ref class Kitchen : Room
{
};
ref class Bedroom : Room
{
};
ref class Guestroom : Bedroom
{
};
ref class MasterBedroom : Bedroom
{
};
ref class Program
{
public:
static void Main()
{
// Demonstrate classes:
Console::WriteLine("Defined Classes:");
Room^ room1 = gcnew Room();
Kitchen^ kitchen1 = gcnew Kitchen();
Bedroom^ bedroom1 = gcnew Bedroom();
Guestroom^ guestroom1 = gcnew Guestroom();
MasterBedroom^ masterbedroom1 = gcnew MasterBedroom();
Type^ room1Type = room1->GetType();
Type^ kitchen1Type = kitchen1->GetType();
Type^ bedroom1Type = bedroom1->GetType();
Type^ guestroom1Type = guestroom1->GetType();
Type^ masterbedroom1Type = masterbedroom1->GetType();
Console::WriteLine("room assignable from kitchen: {0}", room1Type->IsAssignableFrom(kitchen1Type));
Console::WriteLine("bedroom assignable from guestroom: {0}", bedroom1Type->IsAssignableFrom(guestroom1Type));
Console::WriteLine("kitchen assignable from masterbedroom: {0}", kitchen1Type->IsAssignableFrom(masterbedroom1Type));
// Demonstrate arrays:
Console::WriteLine();
Console::WriteLine("Integer arrays:");
array<Int32>^ array2 = gcnew array<Int32>(2);
array<Int32>^ array10 = gcnew array<Int32>(10);
array<Int32, 2>^ array22 = gcnew array<Int32, 2>(2, 2);
array<Int32, 2>^ array24 = gcnew array<Int32, 2>(2, 4);
Type^ array2Type = array2->GetType();
Type^ array10Type = array10->GetType();
Type^ array22Type = array22->GetType();
Type^ array24Type = array24->GetType();
Console::WriteLine("Int32[2] assignable from Int32[10]: {0}", array2Type->IsAssignableFrom(array10Type));
Console::WriteLine("Int32[2] assignable from Int32[2,4]: {0}", array2Type->IsAssignableFrom(array24Type));
Console::WriteLine("Int32[2,4] assignable from Int32[2,2]: {0}", array24Type->IsAssignableFrom(array22Type));
// Demonstrate generics:
Console::WriteLine();
Console::WriteLine("Generics:");
// Note that "int?[]" is the same as "Nullable<int>[]"
//int?[] arrayNull = new int?[10];
array<Nullable^>^ arrayNull = gcnew array<Nullable^>(10);
List<Int32>^ genIntList = gcnew List<Int32>();
List<Type^>^ genTList = gcnew List<Type^>();
Type^ arrayNullType = arrayNull->GetType();
Type^ genIntListType = genIntList->GetType();
Type^ genTListType = genTList->GetType();
Console::WriteLine("Int32[10] assignable from Nullable[10]: {0}", array10Type->IsAssignableFrom(arrayNullType));
Console::WriteLine("List<Int32> assignable from List<Type^>: {0}", genIntListType->IsAssignableFrom(genTListType));
Console::WriteLine("List<Type^> assignable from List<Int32>: {0}", genTListType->IsAssignableFrom(genIntListType));
Console::ReadLine();
}
};
int main()
{
Program::Main();
}
//This code example produces the following output:
//
// Defned Classes:
// room assignable from kitchen: True
// bedroom assignable from guestroom: True
//kitchen assignable from masterbedroom: False
//
// Integer arrays:
// Int32[2] assignable from Int32[10]: True
// Int32[2] assignable from Int32[2,4]: False
// Int32[2,4] assignable from Int32[2,2]: True
//
// Generics:
// Int32[10] assignable from Nullable[10]: False
// List<Int32> assignable from List<Type^>: False
// List<Type^> assignable from List<Int32>: False
using System;
using System.Collections.Generic;
class Program
{
public static void Main()
{
// Demonstrate classes:
Console.WriteLine("Defined Classes:");
Room room1 = new Room();
Kitchen kitchen1 = new Kitchen();
Bedroom bedroom1 = new Bedroom();
Guestroom guestroom1 = new Guestroom();
MasterBedroom masterbedroom1 = new MasterBedroom();
Type room1Type = room1.GetType();
Type kitchen1Type = kitchen1.GetType();
Type bedroom1Type = bedroom1.GetType();
Type guestroom1Type = guestroom1.GetType();
Type masterbedroom1Type = masterbedroom1.GetType();
Console.WriteLine("room assignable from kitchen: {0}", room1Type.IsAssignableFrom(kitchen1Type));
Console.WriteLine("bedroom assignable from guestroom: {0}", bedroom1Type.IsAssignableFrom(guestroom1Type));
Console.WriteLine("kitchen assignable from masterbedroom: {0}", kitchen1Type.IsAssignableFrom(masterbedroom1Type));
// Demonstrate arrays:
Console.WriteLine();
Console.WriteLine("Integer arrays:");
int[] array2 = new int[2];
int[] array10 = new int[10];
int[,] array22 = new int[2, 2];
int[,] array24 = new int[2, 4];
Type array2Type = array2.GetType();
Type array10Type = array10.GetType();
Type array22Type = array22.GetType();
Type array24Type = array24.GetType();
Console.WriteLine("int[2] assignable from int[10]: {0}", array2Type.IsAssignableFrom(array10Type));
Console.WriteLine("int[2] assignable from int[2,4]: {0}", array2Type.IsAssignableFrom(array24Type));
Console.WriteLine("int[2,4] assignable from int[2,2]: {0}", array24Type.IsAssignableFrom(array22Type));
// Demonstrate generics:
Console.WriteLine();
Console.WriteLine("Generics:");
// Note that "int?[]" is the same as "Nullable<int>[]"
int?[] arrayNull = new int?[10];
List<int> genIntList = new List<int>();
List<Type> genTList = new List<Type>();
Type arrayNullType = arrayNull.GetType();
Type genIntListType = genIntList.GetType();
Type genTListType = genTList.GetType();
Console.WriteLine("int[10] assignable from int?[10]: {0}", array10Type.IsAssignableFrom(arrayNullType));
Console.WriteLine("List<int> assignable from List<Type>: {0}", genIntListType.IsAssignableFrom(genTListType));
Console.WriteLine("List<Type> assignable from List<int>: {0}", genTListType.IsAssignableFrom(genIntListType));
Console.ReadLine();
}
}
class Room
{
}
class Kitchen : Room
{
}
class Bedroom : Room
{
}
class Guestroom : Bedroom
{
}
class MasterBedroom : Bedroom
{
}
//This code example produces the following output:
//
// Defned Classes:
// room assignable from kitchen: True
// bedroom assignable from guestroom: True
// kitchen assignable from masterbedroom: False
//
// Integer arrays:
// int[2] assignable from int[10]: True
// int[2] assignable from int[2,4]: False
// int[2,4] assignable from int[2,2]: True
//
// Generics:
// int[10] assignable from int?[10]: False
// List<int> assignable from List<Type>: False
// List<Type> assignable from List<int>: False
Imports System.Collections.Generic
Module Example
Public Sub Main()
Console.WriteLine("Defined Classes:")
Dim room1 As New Room()
Dim kitchen1 As New Kitchen()
Dim bedroom1 As New Bedroom()
Dim guestroom1 As New Guestroom()
Dim masterbedroom1 As New MasterBedroom()
Dim room1Type As Type = room1.GetType()
Dim kitchen1Type As Type = kitchen1.GetType()
Dim bedroom1Type As Type = bedroom1.GetType()
Dim guestroom1Type As Type = guestroom1.GetType()
Dim masterbedroom1Type As Type = masterbedroom1.GetType()
Console.WriteLine("room assignable from kitchen: {0}", room1Type.IsAssignableFrom(kitchen1Type))
Console.WriteLine("bedroom assignable from guestroom: {0}", bedroom1Type.IsAssignableFrom(guestroom1Type))
Console.WriteLine("kitchen assignable from masterbedroom: {0}", kitchen1Type.IsAssignableFrom(masterbedroom1Type))
' Demonstrate arrays:
Console.WriteLine()
Console.WriteLine("Integer arrays:")
Dim array10(10) As Integer
Dim array2(2) As Integer
Dim array22(2, 2) As Integer
Dim array24(2, 4) As Integer
Dim array10Type As Type = array10.GetType
Dim array2Type As Type = array2.GetType
Dim array22Type As Type = array22.GetType
Dim array24Type As Type = array24.GetType
Console.WriteLine("Integer(2) assignable from Integer(10): {0}", array2Type.IsAssignableFrom(array10Type))
Console.WriteLine("Integer(2) assignable from Integer(2,4): {0}", array2Type.IsAssignableFrom(array24Type))
Console.WriteLine("Integer(2,4) assignable from Integer(2,2): {0}", array24Type.IsAssignableFrom(array22Type))
' Demonstrate generics:
Console.WriteLine()
Console.WriteLine("Generics:")
Dim arrayNull(10) As Nullable(Of Integer)
Dim genIntList As New List(Of Integer)
Dim genTList As New List(Of Type)
Dim arrayNullType As Type = arrayNull.GetType
Dim genIntListType As Type = genIntList.GetType
Dim genTListType As Type = genTList.GetType
Console.WriteLine("Integer(10) assignable from Nullable(Of Integer)(10): {0}", array10Type.IsAssignableFrom(arrayNullType))
Console.WriteLine("List(Of Integer) assignable from List(Of Type): {0}", genIntListType.IsAssignableFrom(genTListType))
Console.WriteLine("List(Of Type) assignable from List(Of Integer): {0}", genTListType.IsAssignableFrom(genIntListType))
Console.ReadLine()
End Sub
End Module
Class Room
End Class
Class Kitchen : Inherits Room
End Class
Class Bedroom : Inherits Room
End Class
Class Guestroom : Inherits Bedroom
End Class
Class MasterBedroom : Inherits Bedroom
End Class
' The example displays the following output:
' Defined Classes:
' room assignable from kitchen: True
' bedroom assignable from guestroom: True
' kitchen assignable from masterbedroom: False
'
' Integer arrays:
' Integer(2) assignable from Integer(10): True
' Integer(2) assignable from Integer(2,4): False
' Integer(2,4) assignable from Integer(2,2): True
'
' Generics:
' Integer(10) assignable from Nullable(Of Integer)(10): False
' List(Of Integer) assignable from List(Of Type): False
' List(Of Type) assignable from List(Of Integer): False
Im folgenden Beispiel handelt es sich bei der aktuellen Instanz um ein Type-Objekt, das die Klasse Stream darstellt. GenericWithConstraint
ist ein generischer Typ, dessen generischer Typparameter vom Typ sein Stream muss. Die Übergabe des generischen Typparameters an die -Methode gibt an, dass einem Objekt eine Instanz des generischen IsAssignableFrom
Typparameters zugewiesen werden Stream kann.
using System;
using System.IO;
public class Example
{
public static void Main()
{
Type t = typeof(Stream);
Type genericT = typeof(GenericWithConstraint<>);
Type genericParam = genericT.GetGenericArguments()[0];
Console.WriteLine(t.IsAssignableFrom(genericParam));
// Displays True.
}
}
public class GenericWithConstraint<T> where T : Stream
{}
Imports System.IO
Module Example
Public Sub Main()
Dim t As Type = GetType(Stream)
Dim genericT As Type = GetType(GenericWithConstraint(Of ))
Dim genericParam As Type = genericT.GetGenericArguments()(0)
Console.WriteLine(t.IsAssignableFrom(genericParam))
' Displays True.
End Sub
End Module
Public Class GenericWithConstraint(Of T As Stream)
End Class
Hinweise
Die -Methode kann verwendet werden, um zu bestimmen, ob eine Instanz von einer Instanz des aktuellen Typs zugewiesen werden kann. Die -Methode ist am nützlichsten, wenn Sie Objekte behandeln, deren Typen zur Entwurfszeit nicht bekannt sind, und ermöglicht die bedingte Zuweisung, wie im folgenden Beispiel IsAssignableFrom c
gezeigt.
using System;
using System.Collections;
public class Example
{
public static void Main()
{
Type t = typeof(IEnumerable);
Type c = typeof(Array);
IEnumerable instanceOfT;
int[] instanceOfC = { 1, 2, 3, 4 };
if (t.IsAssignableFrom(c))
instanceOfT = instanceOfC;
}
}
Imports System.Collections
Module Example
Public Sub Main()
Dim t As Type = GetType(IEnumerable)
Dim c As Type = GetType(Array)
Dim instanceOfT As IEnumerable
Dim instanceOfC As Integer() = { 1, 2, 3, 4 }
If t.IsAssignableFrom(c) Then
instanceOfT = instanceOfC
End If
End Sub
End Module
Diese Methode stellt daher sicher, dass eine Codezeile wie die folgende zur Laufzeit ausgeführt wird, ohne eine Ausnahme InvalidCastException oder eine ähnliche Ausnahme zu auslösen:
instanceOfT = instanceOfC;
instanceOfT = instanceOfC
Diese Methode kann von einer abgeleiteten Klasse überschrieben werden.
Hinweis
Eine generische Typdefinition kann nicht von einem geschlossenen konstruierten Typ zugewiesen werden. Das heißt, Sie können den geschlossenen konstruierten Typ ( in Visual Basic) nicht einer Variablen MyGenericList<int>
MyGenericList(Of Integer)
vom Typ MyGenericList<T>
zuweisen.
Wenn der Parameter vom Typ ist, basiert das Ergebnis auf dem c
TypeBuilder Typ, der erstellt werden soll. Im folgenden Codebeispiel wird dies mithilfe eines erstellten Typs mit dem Namen B
veranschaulicht.
using System;
using System.Reflection;
using System.Reflection.Emit;
public class A
{}
public class Example
{
public static void Main()
{
AppDomain domain = AppDomain.CurrentDomain;
AssemblyName assemName = new AssemblyName();
assemName.Name = "TempAssembly";
// Define a dynamic assembly in the current application domain.
AssemblyBuilder assemBuilder = domain.DefineDynamicAssembly(assemName,
AssemblyBuilderAccess.Run);
// Define a dynamic module in this assembly.
ModuleBuilder moduleBuilder = assemBuilder.DefineDynamicModule("TempModule");
TypeBuilder b1 = moduleBuilder.DefineType("B", TypeAttributes.Public, typeof(A));
Console.WriteLine(typeof(A).IsAssignableFrom(b1));
}
}
// The example displays the following output:
// True
Imports System.Reflection
Imports System.Reflection.Emit
Public Class A
End Class
Module Example
Public Sub Main()
Dim domain As AppDomain = AppDomain.CurrentDomain
Dim assemName As New AssemblyName()
assemName.Name = "TempAssembly"
' Define a dynamic assembly in the current application domain.
Dim assemBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemName,
AssemblyBuilderAccess.Run)
' Define a dynamic module in this assembly.
Dim moduleBuilder As ModuleBuilder = assemBuilder.DefineDynamicModule("TempModule")
Dim b1 As TypeBuilder = moduleBuilder.DefineType("B", TypeAttributes.Public, GetType(A))
Console.WriteLine(GetType(A).IsAssignableFrom(b1))
End Sub
End Module
' The example displays the following output:
' True