IsAssignableFrom - тип аргумента куда идет? Что первое, а второе? - PullRequest
0 голосов
/ 01 июля 2019

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

С учетом этих типов:

public interface IVehicle {}

public class VehicleBase { }

public class Car : VehicleBase , IVehicle { }

Какой правильный способ проверить, реализует ли экземпляр Car интерфейс или наследует от базового класса?

Это так:

var implements = typeof(IVehicle).IsAssignableFrom(typeof(Car));
var inherits = typeof(VehicleBase).IsAssignableFrom(typeof(Car));

или наоборот?

var implements = typeof(Car).IsAssignableFrom(typeof(IVehicle));
var inherits = typeof(Car).IsAssignableFrom(typeof(VehicleBase));

Я пытаюсь прочитать это как «что-то назначаемое из чего-то», но это не помогает мне вспомнить. Я назначаю вещи на вещи. Я не назначаю вещи из других вещей.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Это происходит следующим образом:

[TestMethod]
public void TheRightWay()
{
    // this is what you want to check
    var implements = typeof(IVehicle).IsAssignableFrom(typeof(Car));
    var inherits = typeof(VehicleBase).IsAssignableFrom(typeof(Car));

    Assert.IsTrue(implements);
    Assert.IsTrue(inherits);
}

Если вы хотите проверить только наследование, вы можете использовать IsSubclassOf, что гораздо более интуитивно понятно.Но если у вас есть два типа, и вы хотите знать, существует ли реализация интерфейса наследования или - возможно, вам все равно, какой - тогда это будет сделано.

Вотпомощь памяти:

IVehicle vehicle = new Car();

Проверка IsAssignableFrom имеет аргументы в том же порядке:

typeof(IVehicle).IsAssignableFrom(typeof(Car))
0 голосов
/ 01 июля 2019

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

Например, плагины;

, когда вы хотите объявить переменную, вы должныопределите тип этой переменной.

SomeType variableName;

Тогда задайте вопрос ... какой тип экземпляра вы можете назначить этой variableName переменной?

Ответ: просто экземпляр типа, производный от SomeType type.

Теперь более реальный пример:

Color variableName;
Int32 myInt;

Тогда у меня возникает вопрос: variableName назначается из myInt переменная?

Ответ: НЕТ

теперь, если вы используете рефлексию.Это довольно просто.

Другой возможный способ:

// left side of assignment  = right side of assignment;

typeof({type of variable on the left side of assignment}).IsAssignableFrom(typeof({type of variable on the right side of assignment}))

А про плагины я уже упоминал.Обычно вы можете попытаться найти все сборки и выполнить цикл, подобный следующему ::1010*

  • для каждой сборки получите все типы -> отфильтруйте все типы, которые не реализуют конкретный контракт (тип).

Итак, вы можете иметь

When my type 't' is implementing my 'contract type / interface' i want to instantiate it

and then is question 
Is my 'contract / interface ' assignable from discovered type 't' ?

and again we have left and right side and result 

typeof(my contract interface ).IsAssignableFrom(typeof( discovered type 't'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...