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添加评论
答案 0 :(得分:6)
这个问题只有在定义上下文时才有意义:
伪装谁/什么?
有几种选择:
伪装,以便运行时将其解释为不同的类型:
不可能使用此方法。运行时甚至不会调用GetType
。
进行伪装,以便其他某些图书馆将其解释为其他类型:
不可能使用此方法。如果图书馆需要B
,您就无法通过您的课程X
,如果图书馆需要object
,则不会将GetType
称为new
,而不是override
。
伪装,以便开发人员在调试时可能会认为它是其他类型:
可能(如果他没有注意到你的伎俩)。为什么呢?
答案 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()
仍会正确返回类型,并且开发人员无法对其进行操作。