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添加评论
这个问题只有在定义上下文时才有意义:
伪装成谁/什么
有几个选项:
-
伪装以便运行时将其解释为不同类型:
使用此方法是不可能的。运行时甚至不调用GetType
。 -
伪装以便其他库将其解释为不同类型:
使用此方法是不可能的。如果库采用B
,则不能传递类X
;如果库采用了object
,则不会调用GetType
,因为它是new
,而不是override
。 -
伪装以便开发人员在调试时可能会认为它是其他类型的:
可能(如果他没有注意到你的把戏)。为什么呢?
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()
仍然可以正确返回类型,并且开发人员无法对其进行操作。