Сравнение базовых типов в отражении

#c# #reflection

#c# #отражение

Вопрос:

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

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

{Name = «MarshalByRefObject», полное имя = «System.MarshalByRefObject»}.

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

Ответ №1:

Среда выполнения имеет помощников для этого:

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

Справочная информация:

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

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

Комментарии:

1. Я заметил, что «typeof(SomeType). Присваивается из (параметр. GetType())»вернет false, если параметром является TransparentProxy, в то время как «param — SomeType» вернет true.

Ответ №2:

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

 passedInParameter.GetType().GetInterfaces();
  

также вы можете попробовать использовать оператор is

 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);
  

Комментарии:

1. Вы можете передавать конкретные типы в параметр метода, который ожидает интерфейс. Как это называется? Проходим мимо его реализации?

2. Вы просто передаете объект, который реализует этот интерфейс

3. @Stecya — правильно … это то, что я сказал. Я просто подумал, что это называется передачей по его базовому типу… Просто спрашиваю, какой термин используется для этого.

4. Вам не нужно использовать typeof здесь

5. не знаю, существует ли специальный термин для такой передачи