C# - Тип проверки интерфейса - PullRequest
0 голосов
/ 22 марта 2020

Я строю StateMachine. Для своих состояний я использую интерфейс:

public interface IState
{
    void Enter();
    void Execute();
    void Exit();
}

У меня всегда активен IState currentState, я хотел бы проверить, какой это тип состояния. Допустим, у меня есть WalkingState и RunningState, я хотел бы проверить, какой из них в настоящее время активен.

Я пробовал что-то вроде:

public bool IsCurrentState<T>()
{
    return (Type)currentState == typeof(T);
}

Но это не позволяет мне приведите currentState к типу, и ничто из того, что я пробовал, также не имеет рабочего.

Ответы [ 3 ]

2 голосов
/ 22 марта 2020

Вы должны использовать что-то вроде этого

public bool IsCurrentState<T>() {
    return currentState is T ;
}
2 голосов
/ 22 марта 2020

Это будет работать:

currentState.GetType() == typeof(T)

Редактировать:

Как уже упоминалось в Ответ Раджана Прасада , вы можете использовать is. is и GetType() == typeof(T) ведут себя по-разному. Прежде всего:

  • Если A : B, instanceOfA is instanceOfB равно true, тогда как instanceOfA.GetType() == typeof(B) равно false.

Если у вас есть только 1 уровень наследования от IState (то есть только FirstLevelState : IState, нет SecondLevelState : FirstLevelState) используйте is, он более производительный и имеет меньше краевых случаев. В противном случае используйте GetType() == typeof(T).

В этом вопросе подробно описаны различия в методах проверки типов: Проверка типов: typeof, GetType или is? .

0 голосов
/ 22 марта 2020

Также вы можете использовать Type.IsAssignableFrom (). Он требует двух элементов System.Type, потому что у вас нет статически объявленного типа. Он отличается от других частей вашего кода, но вы должны знать об этом.

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