Как я могу проверить, является ли экземпляр класса определенным родовым типом? - PullRequest
3 голосов
/ 05 ноября 2010

Скажем, у меня есть простой общий класс следующим образом

public class MyGenericClass<t>
{
   public T {get;set;}
}

Как мне проверить, является ли экземпляр класса MyGenericClass?Например, я хочу сделать что-то вроде этого:

MyGenericClass x = new MyGenericClass<string>();
bool a = x is MyGenericClass;
bool b = x.GetType() == typeof(MyGenericClass);

Но я не могу просто сослаться на MyGenericClass.Visual studio всегда хочет, чтобы я написал MyGenericClass<something>.

Ответы [ 4 ]

2 голосов
/ 05 ноября 2010

Чтобы проверить, является ли ваш экземпляр типа MyGenericClass<T>, вы можете написать что-то вроде этого.

MyGenericClass<string> myClass = new MyGenericClass<string>();
bool b = myClass.GetType().GetGenericTypeDefinition() == typeof(MyGenericClass<>);

Если вы хотите иметь возможность объявить ваш объект как MyGenericClass вместо MyGenericClass<string>, ему потребуется неуниверсальная база MyGenericClass, чтобы быть частью дерева наследования.Но на этом этапе вы сможете ссылаться только на свойства / методы на базе, если позже не приведете к производному универсальному типу.Вы не можете опустить параметр типа при непосредственном объявлении универсального экземпляра. *

* Вы, конечно, можете выбрать вывод типа и написать

var myClass = new MyGenericClass<string>();

Редактировать: Адам Робинсон делает хорошее замечание в комментариях, скажем, у вас есть class Foo : MyGenericClass<string>.Приведенный выше код тестирования не идентифицирует экземпляр Foo как MyGenericClass<>, но вы все равно можете написать код для его проверки.

Func<object, bool> isMyGenericClassInstance = obj =>
    {
        if (obj == null)
            return false; // otherwise will get NullReferenceException

        Type t = obj.GetType().BaseType;
        if (t != null)
        {
            if (t.IsGenericType)
                return t.GetGenericTypeDefinition() == typeof(MyGenericClass<>);
        }

        return false;
    };

bool willBeTrue = isMyGenericClassInstance(new Foo());
bool willBeFalse = isMyGenericClassInstance("foo");
0 голосов
/ 16 мая 2018

Я использую следующее (как я выяснил, все предложения не сработали для меня.

  public static bool IsGenericTypeOf(Type vtype, Type target) {
     return
           vtype.IsGenericType
        && target.ContainsGenericParameters
        && vtype.Name == target.Name
        && vtype.Assembly == target.Assembly
        && vtype.Module == target.Module
        ;
  }
0 голосов
/ 05 ноября 2010

При желании вы можете заставить обобщенный класс реализовывать произвольный (возможно, пустой) интерфейс.Проверка того, принадлежит ли какой-либо объект общему родовому классу, будет просто вопросом проверки, реализовал ли он этот интерфейс.Нет необходимости явно использовать отражение.

0 голосов
/ 05 ноября 2010
List<int> testInt = new List<int>();
List<string> testString = new List<string>();

if (testInt .GetType().Equals(testString.GetType()))
 Console.WriteLine("Y");
else Console.WriteLine("N");

это 'N'

и

testInt.GetType().Equals(typeof(List<int>))
is true

, но если вы хотите просто имя класса

testInt.GetType().FullName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...