Assembly.GetAssembly(type)vs type.Assembly

时间:2012-06-29 14:53:30

标签: c# reflection .net-assembly

我想知道调用这些方法中的哪一种有什么好处,以及为什么?
它们在功能上是否相同,或者我应该总是选择一个而不是另一个?

2 个答案:

答案 0 :(得分:2)

AFAIK它们在功能上是等价的,但是在core-clr(Silverlight之类)中没有Assembly.GetAssembly(Type)

根据您的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)

答案 1 :(得分:0)

来自the documentation for Type.Assembly

  

如果当前Type对象表示构造的泛型类型,则为此   property返回包含泛型类型的程序集   定义。

     

例如,假设您创建了一个名为的程序集   MyGenerics.dll包含泛型类型定义   MyGenericStack<T>。如果你创建一个实例   MyGenericStack<int> in   另一个程序集,构造类型的Assembly属性   返回表示MyGenerics.dll

的Assembly对象

来自Assembly.GetAssembly的文档:

  

要调用此方法,您必须拥有Type对象,这意味着   定义类的程序集必须已经是   加载。