Сравнение базовых типов в отражении - PullRequest
5 голосов
/ 27 апреля 2011

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

Но всякий раз, когда я звоню passedInParameter.GetType().BaseType(), он возвращает "

{Имя = "MarshalByRefObject" FullName = "System.MarshalByRefObject"}.

Разве он не показывает интерфейс, который реализует?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2011

У среды выполнения есть помощники для этого:

if (typeof(ISomeInterface).IsAssignableFrom(passedInParameter.GetType()))
{
}

Справка:

Интерфейсы не базовых типов. Типы CLR не могут иметь несколько базовых типов.

Вы должны иметь возможность перечислять интерфейсы, реализованные типом, но, как вы можете видеть из предложенного мной решения, я не рекомендую делать все это

2 голосов
/ 27 апреля 2011

Интерфейс не является базовым классом. Класс может реализовывать много интерфейсов Если вы хотите получить список интерфейсов, просто используйте

passedInParameter.GetType().GetInterfaces();

также вы можете попробовать is operator

if(passedInParameter is ISomeInterface)
{
    // do some logic
}

Попробуйте использовать этот фрагмент кода

    ParameterInfo param = paramList[i]; 
    Type type = paramArray[i].GetType();

    bool valid = false;
    if (info.ParameterType.IsInterface)
        valid = type.GetInterfaces().Contains(param.ParameterType);
    else
        valid = type.IsSubclassOf(param.ParameterType);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...