Проверьте, если T наследует или реализует класс / интерфейс

Есть ли способ проверить, если T наследует / реализует класс / интерфейс?

private void MyGenericClass<T> ()
{
    if(T ... inherits or implements some class/interface
}
 Samuel03 окт. 2013 г., 21:16
Felix K Даже если этот ответ дублировался много раз, он также помогает многим парням много раз;) ... как я пять минут назад:)
 Oliver23 мая 2012 г., 12:58
Да, это сработает.
 Felix K.23 мая 2012 г., 13:07
Я абсолютно уверен, что этот ответ дублируется много раз!
 user122989523 мая 2012 г., 12:51
это похоже на работу ... if (typeof (TestClass) .IsAssignableFrom (typeof (T))), кто-то может подтвердить мои подозрения? Благодарность

Ответы на вопрос(7)

Вы можете использовать ограничения для класса.

MyClass<T> where T : Employee

Взгляни наhttp: //msdn.microsoft.com/en-us/library/d5x73970.asp

Ошибка, если если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));

 Luke M Willis29 июл. 2014 г., 16:54
Это предполагаемый синтаксис. + 1

Правильный синтаксис:

typeof(Employee).IsAssignableFrom(typeof(T))
Документаци

Возвращаемое значение: true еслиc и текущийType представляют тот же тип, или если текущийType находится в иерархии наследованияc, или если текущийType являетсяinterface что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 тольк когда либо

T а такжеEmployee представляют один и тот же тип; илиEmployee наследует отT.

Это может быть предназначено для использования внескольк case, но для исходного вопроса (и более распространенного использования), чтобы определить, когдаT наследует или реализует некоторыеclass/interface, используйте:

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

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

потому что ты можешь буквальноassign от экземпляр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, следовательно,HorizontalRun а такжеDump)

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

Лож

а такж

FAIL: c1 = b1 b1 = c1FAIL: c2 = b1 b1 = c2

как заявили другие, если вам нужно только проверить, наследует ли класс другой,typeof(T).BaseType == typeof(SomeClass) тоже выполняет свою работу.

Решение Вопроса

Type.IsAssignableFrom ().

ПроверитьT наследует / реализуетEmployee:

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

Если вы ориентируетесь на .NET Core, метод переместился в TypeInfo:

typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).Ge‌​tTypeInfo())
 nikeee23 мая 2012 г., 12:53
О, моя вина. Выполнено
 To Ka04 дек. 2016 г., 00:33
In .net coreIsAssignableFrom ofTypeInfo class принимает только TypeInfo в качестве единственного аргумента, поэтому пример должен быть следующим:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
 Chalky17 июн. 2014 г., 22:29
Синтаксис неверен, см. Ответ ниже.
 Dr. ABT23 мая 2012 г., 12:52
Вы должны обновить свой ответ, например, например. TypeOf (Т) .IsAssignableFrom (TypeOf (IMyInterface))
 Dave Cousineau27 окт. 2016 г., 21:28
Хотя это почти работает, есть проблема, еслиT ограничен другим типомTOther, затем при исполненииtypeof(T) на самом деле оценивается какtypeof(TOther) а не типаT ты на самом деле прошел, и в этом случае,typeof(SomeInterface).IsAssignableFrom(typeof(T)) не удастся (при условииTOther также не реализуетSomeInterface), хотя ваш конкретный тип реализовалSomeInterface.

Ваш ответ на вопрос