2011-11-18 111 views

回答

12

this.GetType()获取当前实例的多态类型,它实际上可能是您要调用this.GetType()的类的子类,并且该子类可能位于不同的程序集中。

考虑以下几点:

AssemblyA.dll:

public class Foo 
{ 
    public void PrintAssembly() 
    { 
     Console.WriteLine(this.GetType().Assembly.GetName()); 
     Console.WriteLine(Assembly.GetExecutingAssembly().GetName()); 
    } 
} 

AssemblyB.dll:

public class Bar : Foo 
{ 
} 

现在,如果你运行下面的代码:

Bar b = new Bar(); 
b.PrintAssembly(); 

的的结果确定装配的两种方法将不是是一样的; this.GetType().Assembly将返回AssemblyB(因为this的实际类型为Bar),而Assembly.GetExecutingAssembly()将返回AssemblyA,因为这是包含Foo.PrintAssembly()方法的程序集。

只有当密封包含对this.GetType()的调用的类型时,才能确定它们指向同一个程序集。

+0

你确定这个逻辑吗? –

+0

@Brandon:是的,我是。 :) – Sven

+1

在那种情况下+1! –

3

一个告诉你类型属于的组件版本。另一个告诉你当前正在执行的程序集版本。但是你已经知道了。

我相信你可以放心地假设正在执行的程序集总是和'this'的一部分一样。至少我想不出为什么它不会。

为了清楚起见,无论您选择其中一个,都将取决于您是在查找类型的装配还是正在执行的装配。假设你的父亲和你的老板是同一个人......你是否在餐桌上称他为老板?或者你是否把他介绍给你的女朋友当老板?使用那些对读取代码的下一个人有意义的代码。

+0

令人敬畏的解释,布兰登。非常感谢。 – woodykiddy

+0

@woodykiddy您的欢迎,但事实证明,你应该只关注第一段和第三段:) –

+0

不用担心。我们都学会了。 :) – woodykiddy

相关问题