在C#中检查对象的编译时类型

问题描述

考虑以下代码

using System;
                    
public class Program
{
    public static void Main()
    {
        A m1 = new B();
        B m2 = new B();
        
        Console.Write("m1: ");
        m1.fun();
        Console.Write("m2: ");
        m2.fun();
    }
}

abstract class A
{
    public abstract void fun ();
}

class B : A
{
    public override void fun()
    {
        if (this.GetType() == typeof(A)) // ????
            Console.WriteLine("A");
        else Console.WriteLine("B");
    }
}

我希望您修改if语句,以便程序为Am1,为Bm2。 我一直在尝试与GetType()typeofisas进行各种组合,但无法完成这项工作。

解决方法

我不确定您的分配规则是什么,但是如果您在基类中有一个虚拟方法并在派生类中重写它,那么您总是会得到“ B”。

如果允许您更改类型的继承,则可以执行以下操作:

public class Program
{
    public static void Main()
    {
        A m1 = new B();
        B m2 = new B();

        Console.Write("m1: ");
        m1.Fun();
        Console.Write("m2: ");
        m2.Fun();

        // m1: A
        // m2: B
    }
}

abstract class A
{
    public void Fun() => Console.WriteLine("A");
}

class B : A
{
    public new void Fun() => Console.WriteLine("B");
}
,

不是虚拟方法,而是通用方法解析仅使用编译时类型信息,因此可以使用它。您可能会定义以下扩展方法:

public static class Extensions
{
    public static void Fun<T>(this T instance)
    {
        Console.WriteLine(typeof(T).Name);
    }
}

并像现在调用虚拟方法一样调用它:

m1.Fun();