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

Checking object's compile-time type in 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 语句,以便程序为 m1 编写 A,为 m2 编写 B。 我一直在尝试 GetType()typeofisas 的各种组合,但无法实现。

我不确定您的赋值规则是什么,但是如果您在基础 class 中有一个虚拟方法并在派生中覆盖它,您总是会得到“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");
}

不适用于虚拟方法,但由于泛型方法解析仅使用 compile-time 类型信息,因此您可以使用它。你可能例如定义以下扩展方法:

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

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

m1.Fun();