Type.IsAssignableFrom(Type) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Określa, czy wystąpienie określonego typu można przypisać do c
zmiennej bieżącego typu.
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
Parametry
- c
- Type
Typ do porównania z bieżącym typem.
Zwraca
true
Jeśli którykolwiek z następujących warunków jest prawdziwy:
c
a bieżące wystąpienie reprezentuje ten sam typ.c
pochodzi bezpośrednio lub pośrednio z bieżącego wystąpienia.c
jest pochodną bezpośrednio z bieżącego wystąpienia, jeśli dziedziczy ono z bieżącego wystąpienia; jest pochodną pośrednio z bieżącego wystąpienia, jeśli dziedziczy z dziedziczenia z jednej lub większej liczby klas dziedziczonychc
z bieżącego wystąpienia.Bieżące wystąpienie jest interfejsem, który
c
implementuje.c
jest parametrem typu ogólnego, a bieżące wystąpienie reprezentuje jedno z ograniczeń parametruc
.c
reprezentuje typ wartości, a bieżące wystąpienie reprezentuje wartośćnullowalny < c >
(Nullable(Of c)
w Visual Basic).
false
Jeśli żaden z tych warunków nie jest prawdziwy, lub jeśli c
wartość to null
.
Implementuje
Przykłady
W poniższym przykładzie pokazano metodę IsAssignableFrom
przy użyciu zdefiniowanych klas, tablic liczb całkowitych i typów ogólnych.
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
W poniższym przykładzie bieżące wystąpienie jest Type obiektem reprezentującym Stream klasę . GenericWithConstraint
jest typem ogólnym, którego parametr typu ogólnego musi być typu Stream . Przekazanie parametru typu ogólnego do metody wskazuje, że wystąpienie parametru typu ogólnego można przypisać IsAssignableFrom
do Stream obiektu.
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
Uwagi
Metoda może służyć do określenia, czy wystąpienie klasy może zostać przypisane do wystąpienia bieżącego typu. Metoda jest najbardziej przydatna w przypadku obsługi obiektów, których typy nie są znane w czasie projektowania, i umożliwia przypisanie warunkowe, jak pokazano w poniższym IsAssignableFrom c
przykładzie.
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
Dzięki temu ta metoda zapewnia, że wiersz kodu podobny do poniższego będzie wykonywany w czasie wykonywania bez zgłaszania wyjątku InvalidCastException lub podobnego wyjątku:
instanceOfT = instanceOfC;
instanceOfT = instanceOfC
Metoda ta może być zastąpiona przez klasę pochodną.
Uwaga
Definicji typu ogólnego nie można przypisać z zamkniętego skonstruowanego typu. Oznacza to, że nie można przypisać zamkniętego skonstruowanego typu MyGenericList<int>
(w MyGenericList(Of Integer)
Visual Basic) do zmiennej typu MyGenericList<T>
.
Jeśli parametr c
jest typu , wynik jest oparty na TypeBuilder typie, który ma zostać s zbudowana. Poniższy przykład kodu demonstruje to przy użyciu typu wbudowanego o nazwie B
.
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