您好我需要知道如何在C#中检查相同类型的对象。
情景:
class Base_Data{}
class Person : Base_Data { }
class Phone : Base_data { }
class AnotherClass
{
public void CheckObject(Base_Data data)
{
if (data.Equals(Person.GetType()))
{ //<-- Visual Studio 2010 gives me error, says that I am using 'Person' is a type and not a variable.
}
}
}
答案 0 :(得分:82)
您可以使用is
operator:
if (data is Person)
{
// `data` is an instance of Person
}
另一种可能性是使用as
operator:
var person = data as Person;
if (person != null)
{
// safely use `person` here
}
或者,从C#7开始,使用结合以上两者的pattern-matching form of the is
operator:
if (data is Person person)
{
// `data` is an instance of Person,
// and you can use it as such through `person`.
}
答案 1 :(得分:24)
这完全取决于你所追求的目标。使用is
或as
(如Darin的回答所示)会告诉您data
是指Person
的实例还是子类型。这是最常见的形式(虽然如果你可以设计远离需要它,那会更好) - 如果这就是你需要的,Darin的答案是使用的方法。
但是,如果您需要完全匹配 - 如果您不希望采取特定操作,如果data
引用从Person
派生的某个类的实例,只有Person
本身,你需要这样的东西:
if (data.GetType() == typeof(Person))
这是相对罕见的 - 此时绝对值得质疑你的设计。
答案 2 :(得分:9)
让我们一步一步解决这个问题。第一步是必需的,接下来的两步是可选的,但建议。
第一次修正(需要)确保您没有将某种类型的对象与System.Type
类型的对象进行比较:
if (data.GetType().Equals(typeof(Person))) ...
// ^^^^^^^^^^
// add this to make sure you're comparing Type against Type, not
// Base_Data against Type (which caused the type-check error)!
其次,将此简化为:
if (data is Person) ... // this has (almost) the same meaning as the above;
// in your case, it's what you need.
第三,完全摆脱if
声明!这是通过采用多态(或者更确切地说,方法重写)来完成的。如下:
class Base_Data
{
public virtual void Check() { ... }
}
class Person : Base_Data
{
public override void Check()
{
... // <-- do whatever you would have done inside the if block
}
}
class AnotherClass
{
public void CheckData(Base_Data data)
{
data.Check();
}
}
如您所见,条件代码已转换为Check
类及其派生类Base_Data
的{{1}}方法。不再需要这种类型检查Person
语句!
答案 3 :(得分:0)
这个问题的意图有点不清楚,但是我在寻找一个方法来检查2个对象是否属于同一类型时发现了这个问题。这是我的解决方案,并且所有测试都通过了:
using NUnit.Framework;
[TestFixture]
public class TypeEqualityChecks
{
class Base_Data { }
class Person : Base_Data { }
class Phone : Base_Data { }
class AnotherClass
{
public static bool CheckObjects(Base_Data d1, Base_Data d2) {
return d1.GetType() == d2.GetType();
}
}
[Test]
public static void SameTypesAreEqual() {
Base_Data person1 = new Person();
Base_Data person2 = new Person();
Assert.IsTrue(AnotherClass.CheckObjects(person1, person2));
}
[Test]
public static void DifferentActualTypesAreNotEqual() {
Base_Data person = new Person();
Base_Data phone = new Phone();
Assert.IsFalse(AnotherClass.CheckObjects(person, phone));
}
[Test]
public static void BaseTypeAndChildTypeAreNotEqual() {
Base_Data baseData = new Base_Data();
Base_Data person = new Person();
Assert.IsFalse(AnotherClass.CheckObjects(baseData, person));
}
}