3

我想知道调用这两种方法有什么好处(如果有的话),为什么?
它们在功能上是等效的,还是我应该总是选择一个而不是另一个?

4

2 回答 2

2

AFAIK 它们在功能上是等效的,但是 Assembly.GetAssembly(Type) 在 core-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-29T14:57:58.893 回答
0

文档中Type.Assembly

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

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

Assembly.GetAssembly的文档中:

为了调用此方法,您必须有一个Type对象,这意味着定义该类的程序集必须已经加载。

于 2012-06-29T14:58:09.360 回答