这个.GetType()。Assembly.GetName()。版本和Assembly.GetExecutingAssembly()。GetName()。版本有什么区别?

时间:2011-11-18 06:58:11

标签: c# .net

正如标题所示,这两者如何相互区别?我们可以安全地说他们俩一样吗?什么时候我们选择其中一个是最好的情况?我碰巧碰到了它,我不太确定。我希望有人能清除我的怀疑。提前致谢。

2 个答案:

答案 0 :(得分:13)

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()方法的程序集。 / p>

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

答案 1 :(得分:3)

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

我相信你可以放心地假设执行程序集总是与'this'所属的程序集相同。至少我想不出为什么不会这样。

为了清楚起见,您是选择其中一个还是另一个,取决于您是在寻找类型的程序集还是正在执行的程序集。假设你的父亲和你的老板是同一个人...你在餐桌上称他为你的老板吗?或者你把他介绍给你的女朋友作为你的老板?使用对下一个阅读代码的人有意义的那个。