C#类不能伪装成另一个类,因为不能重写GetType方法

本文关键字:不能 重写 GetType 方法 因为 另一个 伪装 | 更新日期: 2023-09-27 18:19:59

CLR中有一条通过C#的语句在C#中,一个类不能伪装成另一个类,因为GetType是virutal,因此不能覆盖

但我认为在C#中,我们仍然可以隐藏GetType的父实现。

我一定错过了什么

如果我隐藏了基本的GetType实现,那么我可以将我的类伪装成另一个类,对吗?

这里的关键不是GetType是否是virutal,问题是我们能否在C#中将一个类伪装成另一个类

以下是可能重复的第4个答案,所以我的问题更多地是关于这个。这种伪装可能吗?如果可能,我们怎么能说我们可以防止C#中的类类型伪装?无论GetType是否为虚拟

虽然不能覆盖对象是正确的。GetType()方法,您可以使用"new"来完全重载它,从而欺骗另一个已知类型。这很有趣,然而,我还没有想好如何从头开始创建"Type"对象的实例,因此示例下面假装是另一种类型。

public class NotAString {
    private string m_RealString = string.Empty;
    public new Type GetType()
    {
        return m_RealString.GetType();
    } } 

在创建了这个实例之后,(new NotAString()).GetType()确实会返回字符串的类型。

分享|edit|flag应答3月15日18:39

Snooze博士213几乎所有关注GetType的东西都有对象的实例,或者至少有一些它们控制或可以控制的基类型原因。如果您已经拥有派生类型最多的实例那么就没有必要对其调用GetType有人在对象上使用GetType,他们可以确定这是系统的实现,而不是任何其他自定义定义Servy 3月15日18:54添加评论

C#类不能伪装成另一个类,因为不能重写GetType方法

这个问题只有在定义上下文时才有意义:
伪装成谁/什么

有几个选项:

  1. 伪装以便运行时将其解释为不同类型:
    使用此方法是不可能的。运行时甚至不调用GetType

  2. 伪装以便其他库将其解释为不同类型:
    使用此方法是不可能的。如果库采用B,则不能传递类X;如果库采用了object,则不会调用GetType,因为它是new,而不是override

  3. 伪装以便开发人员在调试时可能会认为它是其他类型的:
    可能(如果他没有注意到你的把戏)。为什么呢?

GetType不是虚拟的,否则它应该被覆盖。它是外部

如果要隐藏基类的实现,可以使用new修饰符。

有多种方法可以了解对象实例的类型。下面的例子展示了这种伪装是多么容易被揭穿:

public static class TestClass {
    public static void TestMethod() {
        var x=new Pretended();
        Console.WriteLine("{0}", x.GetType());
        Console.WriteLine("{0}", (x as object).GetType());
    }
}
public partial class Pretended {
    public new Type GetType() {
        return typeof(int);
    }
}

TestMethod:的输出

System.Int32

伪装

在c#中,大多数(注意:不是所有)类型都派生自object,也就是说,它们的最终基类是object。因为GetType是不可重写的,所以base.GetType()总是存在的。任何在不调用GetType()fake实现的情况下了解类型的方法都只会暴露真实类型。

GetType方法未标记为virtual,因此无法覆盖。使用new关键字可以隐藏GetType的实现,但base.GetType()仍然可以正确返回类型,并且开发人员无法对其进行操作。