Type.IsAssignableFrom(Type) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
지정한 c 형식의 인스턴스를 현재 형식의 변수에 할당할 수 있는지 여부를 결정합니다.
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
매개 변수
- c
- Type
현재 형식과 비교할 형식입니다.
반환
다음 조건 중 하나 이상이 true일 경우 true입니다.
c및 현재 인스턴스가 동일한 형식으로 나타납니다.c가 현재 인스턴스에서 직접 또는 간접으로 파생됩니다. 현재 인스턴스에서 상속하는 경우c는 현재 인스턴스에서 직접 파생되며 현재 인스턴스에서 상속하는 하나 이상의 클래스의 연속에서 상속하는 경우c는 현재 인스턴스에서 직접 파생됩니다.현재 인스턴스는
c를 구현하는 인터페이스입니다.c는 제네릭 형식 매개 변수이며, 현재 인스턴스는c의 제약 조건 중 하나를 나타냅니다.c는 값 유형을 나타내며 현재 인스턴스는Nullable<c>(Visual Basic에서Nullable(Of c))를 나타냅니다.
이러한 조건에 해당하지 않거나 c가 false이면 null입니다.
구현
예제
다음 예제에서는 정의 된 IsAssignableFrom 클래스, 정수 배열 및 제네릭을 사용 하 여 메서드.
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
다음 예제에서 현재 인스턴스는 Stream 클래스를 나타내는 Type 개체입니다. GenericWithConstraint 는 제네릭 형식 매개 변수가 형식이어야 하는 제네릭 Stream 형식입니다. 제네릭 형식 매개 변수를 메서드에 전달하면 IsAssignableFrom 제네릭 형식 매개 변수의 인스턴스를 개체에 할당할 수 있음을 Stream 나타냅니다.
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
설명
IsAssignableFrom메서드를 사용하여 인스턴스를 현재 형식의 인스턴스에 할당할 수 있는지 여부를 확인할 c 수 있습니다. 메서드는 다음 예제와 같이 디자인 타임에 형식을 알 수 없으며 조건부 할당을 허용하는 개체를 처리할 때 가장 유용합니다.
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
따라서 이 메서드는 예외 또는 유사한 예외를 throw하지 않고 런타임에 다음과 같은 코드 줄이 실행되도록 합니다. InvalidCastException
instanceOfT = instanceOfC;
instanceOfT = instanceOfC
이 메서드는 파생 클래스에서 재정의할 수 있습니다.
참고
제네릭 형식 정의는 닫힌 생성 형식에서 할당할 수 없습니다. 즉, 닫힌 생성 MyGenericList<int> MyGenericList(Of Integer) 형식(Visual Basic)을 형식의 변수에 할당할 수 MyGenericList<T> 없습니다.
매개 c 변수가 형식인 경우 TypeBuilder 결과는 빌드할 형식을 기반으로 합니다. 다음 코드 예제에서는 라는 빌드된 형식을 사용 하 여이 설명 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