Если вы знаете каждый из типов, с которыми хотите сравнить, используйте оператор is
:
if (this is WorldListener)
{
// ...
}
else if (this is MasterListener)
{
// ...
}
В качестве альтернативы, вы можете использовать GetType
, если хотите немного большей гибкости:
var type = GetType();
// Do some logic on the type to determine what to do next.
Вы должны быть осторожны с этим подходом, однако; Как правило, это указывает на плохой дизайн, который вы должны явно проверять на типы (как настаивают эти милые люди ). Вместо этого почти всегда более целесообразно использовать полиморфизм для делегирования желаемого поведения базовому классу (используя виртуальный или абстрактный метод в базовом классе) - это, в конце концов, то, для чего он предназначен!
Вы можете применить полиморфизм примерно так:
static class Program
{
static void Main(string[] args)
{
Listener listener = new WorldListener();
listener.DoSomething();
}
}
abstract class Listener
{
public void DoSomething()
{
var output = Decorate("Did something!");
ConsoleWrapper.WriteLine(output);
}
protected abstract string Decorate(string input);
}
class WorldListener : Listener
{
protected override string Decorate(string input)
{
return string.Format("[World] {0}", input);
}
}
class MasterListener : Listener
{
protected override string Decorate(string input)
{
return string.Format("[Master] {0}", input);
}
}
Это приведет к выводу [World] Did something!
. Преимущество этого подхода состоит в том, что если вы когда-нибудь захотите добавить другой тип слушателя, это просто вопрос определения нового класса для него с помощью соответствующего метода Decorate
; нет необходимости изменять Listener
сам.