【问题标题】:Checking object's compile-time type in C#在 C# 中检查对象的编译时类型
【发布时间】:2023-04-01 22:00:01
【问题描述】:

考虑以下代码:

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 语句,以便程序将A 写入m1,将B 写入m2。 我一直在尝试与 GetType()typeofisas 的各种组合,但无法成功。

【问题讨论】:

  • 如果您确实需要在生产代码中执行此操作,那么您做的非常错误。这只是一个有趣的挑战吗?
  • @Sweeper 不,实际上,我的教授在上次测试时给了我这样的评估,我无法解决这个问题,但我仍然想知道下次如何做这样的事情。
  • 你上面的例子没有办法做到这一点。您必须修改类定义或继承模型才能使类似的工作正常工作,例如在 Jerry 的回答中。此外,这实际上不是编译时类型检查。这是运行时类型检查 :)。

标签: c# types compile-time compile-time-type-checking


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不使用虚方法,但由于泛型方法解析仅使用编译时类型信息,您可以使用它。你可能例如定义如下扩展方法:

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

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

    m1.Fun();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2019-04-20
      • 2017-07-01
      • 2020-02-07
      相关资源
      最近更新 更多