我试图将作为对象传递的类类型与方法所在的另一侧的类类型进行比较。
我该怎么做?
到目前为止,我有这个。
一方:
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);
}
}
答案 0 :(得分:4)
您可以使用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);
}
答案 1 :(得分:2)
如果可能,我建议使用重载:
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
后会立即超出范围。
答案 2 :(得分:1)
您可以使用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);
}
}