我想知道调用这两个方法中的任何一个有什么好处,为什么?
它们在功能上是否相同,或者我应该总是选择一个而不是另一个?
发布于 2012-06-29 22:57:59
它们在功能上是等效的,但是Assembly.GetAssembly(类型)在核心-clr (Silverlight等)中不可用
根据您的Type是否为空,您将得到不同的错误。Type.Assembly会抛出一个NullReferenceException (自然地),而Assembly.GetAssembly(Type)会抛出一个ArgumentNullException。根据您的代码,您可能更喜欢其中之一。
编辑:查看源代码,对于Assembly.GetAssembly
public static Assembly GetAssembly(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
Contract.EndContractBlock();
Module m = type.Module;
if (m == null)
return null;
else
return m.Assembly;
}而System.Type.Assembly
public abstract Assembly Assembly {
get;
}如果我没记错的话,运行时类型的System.Type是它们自己的子类(或类似的子类),所以我猜每个子类都可能被覆盖,并直接返回一个程序集引用。除此之外,我认为除了由您自己决定的null处理之外,对于您的代码来说,没有什么重要的区别。(或者,如果您运行的是Core-CLR,在这种情况下,您无论如何都没有Assembly.GetAssembly,所以必须使用Type.Assembly)
发布于 2012-06-29 22:58:09
来自the documentation for Type.Assembly
如果当前
Type对象表示构造的泛型类型,则此属性返回包含该泛型类型定义的程序集。
例如,假设您创建了一个包含泛型类型定义MyGenericStack<T>的名为MyGenerics.dll的程序集。如果在另一个程序集中创建MyGenericStack<int>的实例,则构造类型的assembly属性将返回表示MyGenerics.dll的Assembly对象
来自Assembly.GetAssembly的文档
若要调用此方法,必须具有
Type对象,这意味着必须已加载在其中定义类的程序集。
https://stackoverflow.com/questions/11264060
复制相似问题