C#类不能伪装成另一个类,因为GetType方法不能被覆盖

时间:2013-06-26 03:27:16

标签: c#

CLR中有一条声明通过C#说 在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()确实会返回字符串的类型。

     

分享|编辑|标志于3月15日18:39回答

     

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

3 个答案:

答案 0 :(得分:6)

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

有几种选择:

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

  2. 进行伪装,以便其他某些图书馆将其解释为其他类型:
    不可能使用此方法。如果图书馆需要B,您就无法通过您的课程X,如果图书馆需要object,则不会将GetType称为new,而不是override

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

答案 1 :(得分:4)

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

如果要隐藏基类的实现,可以使用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()实现的情况下知道类型的方法,只暴露实际类型。

答案 2 :(得分:2)

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