Сравнить объект с классом

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

Как я могу это сделать?

У меня это пока есть.

С одной стороны:

TechToday techToday = new TechToday();
SoftwareRevolution softwareRevolution = new SoftwareRevolution();

Subcriber s1 = new Subcriber();
s1.Subcribe(techToday);
s1.Subcribe(softwareRevolution);

Обратная сторона:

class Subcriber
{
    TechToday tt = new TechToday();
    SoftwareRevolution sr = new SoftwareRevolution();

    public void Subcribe(Object s)
    {
        if (s==tt)
            new ConsoleObserver(s);
        else                
            new ConsoleOutput(s);

    }

}

Вместо if (s == tt) сделать if (s is TechToday) { new ConsoleObserver (s as TechToday); }

Rufus L 21.03.2018 17:04

@RufusL код сбивает с толку, думаю, вы правы.

maccettura 21.03.2018 17:05

@maccettura Метод одновременно обрабатывает только одну подписку. Он должен сделать это, получив один «объект» в качестве параметра, а затем определив, является ли этот объект классическим или субъектом событий. Я все еще новичок в этом шаблоне кода, поэтому его метод проб и ошибок для меня

Cleaven 21.03.2018 17:07

Для меня это не имеет особого смысла. Созданные объекты (ConsoleObserver и ConsoleOutput) выйдут из области видимости, когда Subscribe вернется ... И что это: вы хотите сравнить типы или экземпляры?

Fildor 21.03.2018 17:14

@Cleaven Я все еще думаю, что тебе лучше использовать перегрузку

maccettura 21.03.2018 17:33

@maccettura Я выполняю инструкции задания

Cleaven 21.03.2018 17:34

Что за находятся "инструкция о назначении"?

Fildor 21.03.2018 17:34

@Cleaven Тогда я мог бы предложить найти новый курс, это не то, как вы обычно справляетесь с этим в реальном мире

maccettura 21.03.2018 17:34
stackoverflow.com/questions/981330/…
Zaxxon 21.03.2018 18:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
79
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать оператор is, чтобы проверить, принадлежит ли объект этому конкретному типу, например:

if (s is TechToday)
        new ConsoleObserver(s);

или вы можете сделать что-то вроде:

if (s.GetType() == typeof(TechToday))

если вы хотите обеспечить равенство объектов, вам нужно сначала проверить его тип, а затем указать ссылку на этот конкретный тип, а затем проверить равенство примерно так:

if (s is TechToday)
{
   TechToday tt2 = s as TechToday;
   if (tt2 == tt)
       new ConsoleObserver(tt2);
}

или вы также можете сделать это так:

TechToday tt2 = s as TechToday;
if (tt2 == tt)
    new ConsoleObserver(tt2);

Другой вариант - использовать новую функцию сопоставления с образцом C# 7:

if (s is TechToday tt2)
{
   if (tt2 == tt)
      new ConsoleObserver(tt2);
}

Кстати, if (s is TechToday) { TechToday tt2 = s as TechToday избыточен, вы, конечно, можете использовать TechToday tt2 = s as TechToday; if (tt2 != null)... или сопоставление с образцом.

vc 74 21.03.2018 17:11

да @ vc74, и нам не нужна нулевая проверка, если сравнение предназначено, оно вернет false, если какое-либо из них равно нулю

Ehsan Sajjad 21.03.2018 17:16

Большое спасибо за Вашу помощь :)

Cleaven 21.03.2018 17:24

рад что помог! :)

Ehsan Sajjad 21.03.2018 17:25

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

class Subcriber
{
    public void Subcribe(Object s)
    {
        if (s is TechToday)
            new ConsoleObserver(s);
        else                
            new ConsoleOutput(s);

    }
}

Однако использование "as" может быть лучше:

class Subcriber
{
    public void Subcribe(Object s)
    {
        var tt = s as TechToday; 
        if (tt!=null)
           // unlike above 
           // value passed to ConsoleObserver is TechToday
           // casted already

            new ConsoleObserver(tt); 
        else                
            new ConsoleOutput(s);
    }
}

Я бы посоветовал по возможности использовать перегрузки:

class Subcriber
{
    public void Subcribe(TechToday s)
    {
        new ConsoleObserver(s);
    }

    public void Subcribe(SoftwareRevolution s)
    {               
        new ConsoleOutput(s);
    }

}

Если вам нужно остаться с object в сигнатуре Subscribe, вы, вероятно, захотите использовать что-то вместе

if ( s is TechToday ) { new ConsoleObserver(s); }

Но в конце концов, это не имеет большого смысла, потому что как есть, созданные объекты выйдут из области видимости сразу после выхода из Subscribe.

Другие вопросы по теме