检查对象是否属于同一类型

时间:2010-11-26 17:50:30

标签: c# object

您好我需要知道如何在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.

        }
    }
}

4 个答案:

答案 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)

这完全取决于你所追求的目标。使用isas(如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));
    }
}