C# 将对象与类进行比较

C# 将对象与类进行比较,c#,class,object,C#,Class,Object,我试图将作为对象传递的类类型与方法所在的另一侧的类类型进行比较 我该怎么做 到目前为止,我有这个 一方面: TechToday techToday = new TechToday(); SoftwareRevolution softwareRevolution = new SoftwareRevolution(); Subcriber s1 = new Subcriber(); s1.Subcribe(techToday); s1.Subcribe(softwareRevolution);

我试图将作为对象传递的类类型与方法所在的另一侧的类类型进行比较

我该怎么做

到目前为止,我有这个

一方面:

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

    }

}

您可以使用
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);
}
如果希望实现对象的相等,则需要首先检查对象的类型,然后将引用转换为该特定类型,然后检查相等性,如:

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

您可以使用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);
    }

}
如果您必须保留
Subscribe
签名中的
object
,您可能需要使用一些东西

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

但是毕竟,这没有多大意义,因为按原样,创建的对象在离开
Subscribe

后会立即超出范围,而不是
if(s==tt)
do
if(s is TechToday){new ConsoleObserver(s as TechToday);
@RufusL代码很混乱,我想你可能是对的。@maccettura这个方法一次只处理一个订阅。它必须通过接收单个“对象”作为其参数,然后确定该对象是经典对象还是事件主题来完成此操作。我对这种代码模式还是相当陌生的,所以它对我来说是反复试验的me@Cleaven我可能会建议你找一门新的课程,这不是你在现实世界中通常的处理方式。如果(s是TechToday){TechToday tt2=s as TechToday太过分了,你可以使用
TechToday tt2=s as TechToday;如果(tt2!=null)…
或courseyes@vc74的模式匹配,如果要进行比较,我们不需要对事件进行空检查,如果其中一个为空,它将返回false非常感谢您的帮助:)很高兴它有帮助!:)