‘T’가 클래스 / 인터페이스를 상속하거나 구현하는지 확인 MyGenericClass<T> () {

T가 클래스 / 인터페이스를 상속 / 구현하는지 테스트하는 방법이 있습니까?

private void MyGenericClass<T> ()
{
    if(T ... inherits or implements some class/interface
}



답변

Type.IsAssignableFrom () 이라는 메서드가 있습니다 .

T상속 / 구현 여부를 확인하려면 다음을 수행하십시오 Employee.

typeof(Employee).IsAssignableFrom(typeof(T));

.NET Core를 대상으로하는 경우 메서드가 TypeInfo로 이동되었습니다.

typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).Ge‌​tTypeInfo())


답변

클래스에 제약 조건을 사용할 수 있습니다.

MyClass<T> where T : Employee

http://msdn.microsoft.com/en-us/library/d5x73970.aspx를 살펴보십시오 .


답변

컴파일 중에 확인하려면 : 원하는 인터페이스 / 클래스를 구현 T 하지 않으면 오류가 발생하면 다음 제약 조건을 사용할 수 있습니다.

public void MyRestrictedMethod<T>() where T : MyInterface1, MyInterface2, MySuperClass
{
    //Code of my method here, clean without any check for type constraints.
}

도움이 되었기를 바랍니다.


답변

올바른 구문은 다음과 같습니다.

typeof(Employee).IsAssignableFrom(typeof(T))

선적 서류 비치

반환 값 : true 경우 c전류와 Type같은 유형을 표시, 또는 현재이 경우 Type의 상속 계층 구조에 c, 또는 현재는 경우 Typeinterface것을 c구현하는 경우, 또는 c제네릭 형식 매개 변수이며, 전류 Type의 제약 중 하나를 나타냅니다 c, 또는 만약이 c값의 형식을 나타내고, 전류 Type나타낸다 Nullable<c>( Nullable(Of c)Visual Basic에서). false이러한 조건이 그렇지 않은 경우에 true, 또는 경우가 c있습니다 null.

출처

설명

만약 Employee IsAssignableFrom T다음 T에서 상속 Employee.

사용법

typeof(T).IsAssignableFrom(typeof(Employee)) 

다음 중 하나 일 true 때만 반환

  1. T그리고 Employee같은 종류의 표현; 또는,
  2. Employee에서 상속 T합니다.

이것은 어떤 경우에는 의도 된 사용법 일 수 있지만 원래 질문 (및 더 일반적인 사용법)의 경우 T일부 class/를 상속하거나 구현 하는시기를 결정 interface하려면 다음을 사용하십시오.

typeof(Employee).IsAssignableFrom(typeof(T))


답변

모두가 정말로 의미하는 것은 :

typeof(BaseType).IsAssignableFrom(typeof(DerivedType)) // => true

의 인스턴스 에서 의 인스턴스에 문자 그대로 할당 할 수 있기 때문 DerivedType입니다 BaseType.

DerivedType childInstance = new DerivedType();
BaseType parentInstance = childInstance; // okay, assigning base from derived
childInstance = (DerivedType) parentInstance; // not okay, assigning derived from base

언제

public class BaseType {}
public class DerivedType : BaseType {}

머리를 감싸는 데 문제가있는 경우 몇 가지 구체적인 예 :

(LinqPad를 통해 HorizontalRunDump)

void Main()
{
    // http://stackoverflow.com/questions/10718364/check-if-t-inherits-or-implements-a-class-interface

    var b1 = new BaseClass1();

    var c1 = new ChildClass1();
    var c2 = new ChildClass2();
    var nb = new nobase();

    Util.HorizontalRun(
        "baseclass->baseclass,child1->baseclass,baseclass->child1,child2->baseclass,baseclass->child2,nobase->baseclass,baseclass->nobase",
        b1.IsAssignableFrom(typeof(BaseClass1)),
        c1.IsAssignableFrom(typeof(BaseClass1)),
        b1.IsAssignableFrom(typeof(ChildClass1)),
        c2.IsAssignableFrom(typeof(BaseClass1)),
        b1.IsAssignableFrom(typeof(ChildClass2)),
        nb.IsAssignableFrom(typeof(BaseClass1)),
        b1.IsAssignableFrom(typeof(nobase))
        ).Dump("Results");

    var results = new List<string>();
    string test;

    test = "c1 = b1";
    try {
        c1 = (ChildClass1) b1;
        results.Add(test);
    } catch { results.Add("FAIL: " + test); }

    test = "b1 = c1";
    try {
        b1 = c1;
        results.Add(test);
    } catch { results.Add("FAIL: " + test); }

    test = "c2 = b1";
    try {
        c2 = (ChildClass2) b1;
        results.Add(test);
    } catch { results.Add("FAIL: " + test); }

    test = "b1 = c2";
    try {
        b1 = c2;
        results.Add(test);
    } catch { results.Add("FAIL: " + test); }

    results.Dump();
}

// Define other methods and classes here
public static class exts {
    public static bool IsAssignableFrom<T>(this T entity, Type baseType) {
        return typeof(T).IsAssignableFrom(baseType);
    }
}


class BaseClass1 {
    public int id;
}

class ChildClass1 : BaseClass1 {
    public string name;
}

class ChildClass2 : ChildClass1 {
    public string descr;
}

class nobase {
    public int id;
    public string name;
    public string descr;
}

결과

baseclass-> baseclass

진실

child1-> baseclass

그릇된

baseclass-> child1

진실

child2-> baseclass

그릇된

baseclass-> child2

진실

nobase-> baseclass

그릇된

baseclass-> nobase

그릇된

  • 실패 : c1 = b1
  • b1 = c1
  • 실패 : c2 = b1
  • b1 = c2

답변

구문은 다음과 같습니다. typeof(Employee).IsAssignableFrom(typeof(T));


답변

IsAssignableFrom이 다른 사람들이 말한 것처럼 가장 좋은 방법이지만 클래스가 다른 클래스에서 상속되는지 확인하기 만하면되는 경우 typeof(T).BaseType == typeof(SomeClass)에도 작업을 수행합니다.