不過兩者都很好理解。
Assembly.CreateQualifiedName用來構建一個完整的類型路徑,該路徑包含程式集名稱,這個路徑可以用在Type.GetType靜態方法中(或者後面要講的Type.ReflectionOnlyGetType靜態方法)。通常構建此類路徑的時候,開發人員直接通過字串串連把類型的全名稱和程式集的名稱中間加一個逗號就可以了,不過還是有必要提一下.NET Framework中有這樣的方法。
範例程式碼:
namespace Mgen
{
class Program
{
class Nested
{
public class Nested2 { }
}
static void Main(string[] args)
{
var fullname = Assembly.CreateQualifiedName(Assembly.GetExecutingAssembly().FullName, typeof(Nested.Nested2).FullName);
Console.WriteLine(fullname);
}
}
}
輸出:
Mgen.Program+Nested+Nested2, Mgen, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
第二個要說的方法就是Type.ReflectionOnlyGetType。這個方法同Type.GetType方法類似,唯一的區別就是如果包含類型的程式集會被載入到只可以反射的上下文中(Reflection-Only上下文),所得到的類型是不可以執行的。
代碼:
class Program
{
static void Main(string[] args)
{
var ad = AppDomain.CreateDomain("domain");
Console.WriteLine("Type.ReflectionOnlyGetType之前");
PrintAssemblies(ad);
//在指定應用程式定義域中調用Type.ReflectionOnlyGetType
ad.DoCallBack(() =>
{
var names = Assembly.CreateQualifiedName(Assembly.GetExecutingAssembly().FullName,
typeof(Program).FullName);
Type.ReflectionOnlyGetType(names, true, false);
});
Console.WriteLine("Type.ReflectionOnlyGetType之後");
PrintAssemblies(ad);
}
//輸出應用程式定義域中ReflectionOnly上下文中的程式集
static void PrintAssemblies(AppDomain ad)
{
foreach (var ass in ad.ReflectionOnlyGetAssemblies())
Console.WriteLine(ass.FullName);
}
}
輸出:
Type.ReflectionOnlyGetType之前
Type.ReflectionOnlyGetType之後
Mgen, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
可以看到,在調用Type.ReflectionOnlyGetType,程式集被載入到了應用程式定義域的反射內容中。