检查对象是否为相同类型

10 浏览
0 Comments

检查对象是否为相同类型

你好,我需要知道如何在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给我一个错误,说我使用的是'type',而不是一个变量'Person'。
        }
    }
}

你好,我需要知道如何在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给我一个错误,说我使用的是'type',而不是一个变量'Person'。
        }
    }
}

0
0 Comments

检查对象是否为相同类型的问题出现的原因是因为在编程中,有时需要判断一个对象是否为特定类型或其子类型的实例。解决这个问题的方法有两种:使用isas操作符,或者使用GetType()方法。

使用isas操作符可以判断data是否引用了Person类的实例或其子类型的实例。这是最常见的情况,如果需要这种判断,可以使用Darin提供的方法。

然而,如果需要精确匹配,即只有当data引用了Person类的实例时才执行特定的操作,而不包括其子类型的实例,就需要使用GetType()方法结合typeof(Person)进行判断。这种情况比较少见,因此在这个时候应该重新考虑设计是否合理。

另外,从C# 7开始,可以在switch语句中使用模式匹配,包括类型模式,来实现类类型的检查。这为解决这个问题提供了另一种方法。

总结起来,检查对象是否为相同类型的问题可以通过使用isas操作符、GetType()方法结合typeof()进行判断,或者使用C# 7中的模式匹配来解决。使用哪种方法取决于具体的需求和设计。

0
0 Comments

检查对象是否为相同类型的问题出现的原因是因为比较的对象类型不一致。解决方法有以下三个步骤:

第一步(必需)是确保不要将某一类型的对象与System.Type类型的对象进行比较:

if (data.GetType().Equals(typeof(Person))) ...
//      ^^^^^^^^^^
//      添加这一行以确保比较的是类型与类型,而不是基类数据与类型(这导致了类型检查错误)!

第二步,简化为:

if (data is Person) ... // 这与上面的代码几乎有相同的含义;
                        // 在您的情况下,这是您需要的。

第三步,完全摒弃if语句!这可以通过使用多态性(或更准确地说是方法重写)来实现,如下所示:

class Base_Data
{
    public virtual void Check() { ... }
}
class Person : Base_Data
{
    public override void Check()
    {
        ... // <-- 在此处执行您本来会在if块中执行的操作
    }
}
class AnotherClass
{
    public void CheckData(Base_Data data)
    {
         data.Check();
    }
}

如您所见,条件代码已经被转移到了Base_Data类及其派生类PersonCheck方法中。不再需要这样的类型检查if语句了!

0
0 Comments

检查对象是否为相同类型的问题是因为我们需要在代码中确定对象的类型,以便进行相应的操作。解决这个问题的方法有几种。

一种方法是使用`is`运算符。通过使用`is`运算符,我们可以检查一个对象是否是指定类型的实例。例如:

if (data is Person)
{
    // `data`是Person类型的实例
}

另一种方法是使用`as`运算符。通过将对象转换为指定类型,我们可以安全地使用它。如果转换成功,`as`运算符返回类型的实例,否则返回`null`。例如:

var person = data as Person;
if (person != null)
{
    // 在这里安全地使用`person`
}

从C# 7开始,还可以使用`is`运算符的模式匹配形式,结合上述两种方法。通过使用模式匹配形式,我们可以将对象转换为指定类型的实例,并在同一行中进行判断和使用。例如:

if (data is Person person)
{
    // `data`是Person类型的实例,
    // 通过`person`可以安全地使用它。
}

如果在第二个示例中转换失败,将抛出异常吗?如果是这样,抛出的异常是什么类型?

在第二个示例中,如果转换失败,`as`运算符将返回`null`,不会抛出异常。因此,我们可以使用`if`语句来检查`person`是否为`null`,以确定转换是否成功。

如果我们希望在转换失败时抛出异常,可以使用常规的强制类型转换。例如:

Person person = (Person)data;

通过使用常规的强制类型转换,如果转换失败,将抛出`InvalidCastException`异常。这样我们就可以在转换失败时捕获异常并采取相应的措施。

在代码中检查对象是否为相同类型的问题可以通过使用`is`运算符、`as`运算符或模式匹配形式来解决。如果需要在转换失败时抛出异常,可以使用常规的强制类型转换。

0