7

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

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

我一定错过了什么

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

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

以下是可能重复的 NO.4 答案,所以我的问题更多于此。这种伪装是否可能,如果可以,我们怎么能说我们可以防止 C# 中的类类型伪装?不管 GetType 是不是虚拟的

虽然确实不能覆盖 object.GetType() 方法,但可以使用“new”完全重载它,从而欺骗另一种已知类型。这很有趣,但是,我还没有弄清楚如何从头开始创建“Type”对象的实例,所以下面的示例假装是另一种类型。

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

创建此实例后,(new NotAString()).GetType() 将确实返回字符串的类型。

share|edit|flag 于 3 月 15 日 18:39 回答

Snooze 博士 213 几乎任何查看 GetType 的东西都有一个对象实例,或者至少是他们控制或可以推理的一些基本类型。如果您已经有一个最派生类型的实例,则无需在其上调用 GetType。关键是只要有人在对象上使用 GetType,他们就可以确定这是系统的实现,而不是任何其他自定义定义。– Servy 3 月 15 日 18:54 添加评论

4

3 回答 3

6

This question only has meaning when you define a context:
Disguise from whom/what?

There are several options:

  1. Disguising so that runtime will interpret it as a different type:
    Not possible using this method. Runtime does not even call GetType.

  2. Disguising so that some other library will interpret it as a different type:
    Not possible using this method. If the library takes B you can not pass your class X, if the library takes object it will not call your GetType as it is new, not override.

  3. Disguising so that a developer may think it is some other type when debugging:
    Possible (if he does not notice your trick). Why, though?

于 2013-06-26T04:03:11.283 回答
4

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(),只会暴露真实类型。

于 2013-06-26T03:35:00.793 回答
2

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

于 2013-06-26T03:51:22.873 回答