C# Assembly.GetAssembly(类型)与type.Assembly

C# Assembly.GetAssembly(类型)与type.Assembly,c#,reflection,.net-assembly,C#,Reflection,.net Assembly,我想知道调用这两种方法的好处是什么,如果有的话,为什么? 它们在功能上是等效的,还是我应该总是选择其中一个而不是另一个?AFAIK它们在功能上是等效的,但是Assembly.GetAssembly(Type)在核心clr中不可用(Silverlight等) 根据类型是否为空,您将得到不同的错误Type.Assembly将抛出NullReferenceException(自然),而Assembly.GetAssembly(Type)将抛出ArgumentNullException。根据您的代码,您

我想知道调用这两种方法的好处是什么,如果有的话,为什么?

它们在功能上是等效的,还是我应该总是选择其中一个而不是另一个?

AFAIK它们在功能上是等效的,但是Assembly.GetAssembly(Type)在核心clr中不可用(Silverlight等)

根据
类型
是否为空,您将得到不同的错误
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;
}
public abstract Assembly Assembly {
    get;
}
鉴于
系统.Type.Assembly

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;
}
public abstract Assembly Assembly {
    get;
}
如果我没记错的话,运行时类型的System.Type是它们自己的子类(或者类似的东西),所以我想每一个都可能重写并直接返回一个程序集引用。除此之外,我认为除了空处理之外,您不必担心代码有任何重大差异,这取决于您自己。(或者如果您正在运行核心CLR,在这种情况下,您没有Assembly.GetAssembly,因此必须使用Type.Assembly)

From

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

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

从以下文件中:

要调用此方法,必须具有
类型
对象,这意味着 在其中定义类的程序集必须已 上膛了


对我来说完全一样。如果没有加载type对象,你怎么能调用
myType.Assembly
?是的,我不知道他们为什么要对
type.Assembly
的泛型进行大量处理,但他们似乎认为这很重要。我读到,
MyGenericStack
从技术上讲可能不存在于
MyGenerics.dll
中,因此,可以在代码的其他地方创建,以保持程序员的理智,类型检查指向
MyGenericStack
声明的程序集。值得一提的是,我想避免歧义。@ChrisSinclair编译器在程序集中创建了一个名为
MyGenericStack`1[[System.Int32,mscorlib,Version=4.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]
的类,您可以在其中实例化
MyGenericStack
,不是声明MyGenericStack的程序集。这意味着使用
Type.Assembly
应该返回程序集,而不是
MyGenericStack.dll
,但MS决定更改行为。它们本质上是等效的,只有当
Type
null
时才会引发不同的异常。(
ArgumentNullException
vs
NullPointerException
)NPE通常是无用的,应该始终通过空检查来防止。让它为您抛出一个
ArgumentNullException
似乎是一个更好的选择。可以安全地假设,正如@JeffMercado所指出的,它们本质上是等价的,Microsoft只想提供一个方法(
Assembly.GetType(type)
)和一个属性(
type.Assembly
)。