System.Type.GetType yöntemleri
Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.
Yöntemin GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) varsayılan uygulamasını daha esnek uygulamalarla değiştirmek için yöntem aşırı yüklemesini GetType ve ilişkili aşırı yüklemelerini (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) ve GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) kullanın. Tür adlarını ve bunları içeren derlemelerin adlarını çözümleyen kendi yöntemlerinizi sağlayarak aşağıdakileri yapabilirsiniz:
- Bir derlemenin hangi sürümünden yüklendiğini denetleyin.
- Derleme adı içermeyen bir tür adı aramak için başka bir yer sağlayın.
- Kısmi derleme adlarını kullanarak derlemeleri yükleyin.
- Ortak dil çalışma zamanı (CLR) tarafından oluşturulmayan alt sınıflarını System.Type döndürür.
Örneğin, sürüme dayanıklı serileştirmede bu yöntem kısmi bir ad kullanarak "en uygun" derlemeyi aramanızı sağlar. Yöntemin GetType diğer aşırı yüklemeleri, sürüm numarasını içeren bir derleme nitelikli tür adı gerektirir.
Tür sisteminin alternatif uygulamalarının CLR tarafından oluşturulmayan alt sınıflarını System.Type döndürmesi gerekebilir; yöntemin diğer aşırı yüklemeleri GetType tarafından döndürülen tüm türler çalışma zamanı türleridir.
Kullanım notları
Bu yöntem aşırı yüklemesi ve ilişkili aşırı yüklemeleri bir türün adıyla derlemenin adı olarak ayrıştırılıp typeName
adları çözümler. Derleme adının çözümü, tür adının çözümlenmesinden önce gerçekleşir çünkü bir tür adı derleme bağlamında çözümlenmelidir.
Not
Derleme nitelikli tür adları kavramını bilmiyorsanız özelliğine AssemblyQualifiedName bakın.
Derlemeye uygun bir ad değilse typeName
, derleme çözümlemesi atlanır. Nitelenmemiş tür adları mscorlib.dll/System.Private.CoreLib.dll veya şu anda yürütülen derleme bağlamında çözümlenebilir veya isteğe bağlı olarak parametresinde typeResolver
bir derleme sağlayabilirsiniz. Farklı ad çözümlemesi türleri için derleme adını ekleme veya çıkarmanın etkileri, Karma ad çözümlemesi bölümünde tablo olarak görüntülenir.
Genel kullanım notları:
Bilinmeyen veya güvenilmeyen arayanlardan gelen veya
typeResolver
gelen yöntemleriassemblyResolver
geçirmeyin. Yalnızca sağladığınız veya bildiğiniz yöntemleri kullanın.Dikkat
Bilinmeyen veya güvenilmeyen arayanların yöntemlerinin kullanılması kötü amaçlı kod için ayrıcalıkların yükseltilmesine neden olabilir.
ve/veya
typeResolver
parametrelerini atlarsanızassemblyResolver
, parametreninthrowOnError
değeri varsayılan çözünürlüğü gerçekleştiren yöntemlere geçirilir.ise
throwOnError
, bu yöntem döndürdüğünde ve TypeLoadException döndürdüğündenull
typeResolver
null
assemblyResolver
bir FileNotFoundException oluşturur.true
Bu yöntem ve
typeResolver
tarafındanassemblyResolver
oluşan özel durumları yakalamaz. Çözümleyici yöntemleri tarafından oluşan özel durumlardan siz sorumlusunuz.
Derlemeleri çözme
assemblyResolver
yöntemi, içinde bulunan typeName
dize derleme adı ayrıştırılarak oluşturulan bir AssemblyName nesnesi alır. Derleme adı içermiyorsa typeName
çağrılmaz assemblyResolver
ve null
öğesine typeResolver
geçirilir.
assemblyResolver
Sağlanmazsa, derlemeyi bulmak için standart montaj yoklama kullanılır. Sağlanırsa assemblyResolver
, GetType yöntem standart yoklama yapmaz; bu durumda, ona geçirdiğiniz tüm derlemeleri işleyebildiğinizden assemblyResolver
emin olmanız gerekir.
assemblyResolver
Derleme çözümlenemiyorsa yöntemi döndürülmelidirnull
. döndürürse null
typeResolver
assemblyResolver
çağrılmaz ve başka işlem gerçekleşmez; ayrıca, ise throwOnError
true
bir FileNotFoundException oluşturulur.
AssemblyName geçirilen assemblyResolver
kısmi bir adsa, bölümlerinin biri veya daha fazlası şeklindedirnull
. Örneğin, sürümü Version yoksa özelliği olur null
. Version özelliği, CultureInfo özelliği ve yönteminin GetPublicKeyToken tümü döndürürsenull
, yalnızca derlemenin basit adı sağlanır. assemblyResolver
yöntemi derleme adının tüm bölümlerini kullanabilir veya yoksayabilir.
Farklı derleme çözümleme seçeneklerinin etkileri, basit ve derlemeye uygun tür adları için Karma ad çözümlemesi bölümünde bir tablo olarak görüntülenir.
Türleri çözümleme
Derleme adı belirtilmezse typeName
, typeResolver
her zaman çağrılır. Bir derleme adı belirtirse typeName
, typeResolver
yalnızca derleme adı başarıyla çözümlendiğinde çağrılır. Veya standart derleme yoklama işlevi döndürüyorsa assemblyResolver
null
typeResolver
, çağrılmaz.
typeResolver
yöntemi üç bağımsız değişken alır:
- Aranacak derleme veya
null
derleme adı içermiyorsatypeName
. - Türün basit adı. İç içe yerleştirilmiş bir tür söz konusu olduğunda, bu en dıştaki içeren türdür. Genel bir tür söz konusu olduğunda, bu genel türün basit adıdır.
- Tür adlarının
true
büyük/küçük harf durumunun yoksayılması durumunda boole değeri.
Uygulama, bu bağımsız değişkenlerin nasıl kullanıldığını belirler. Türü typeResolver
çözümleyemediğinde yöntemin döndürülmesi null
gerekir. ve throwOnError
true
döndürürse null
typeResolver
, bu aşırı yüklemesi GetType bir TypeLoadExceptionoluşturur.
Farklı tür çözümleme seçeneklerinin etkileri, basit ve derlemeye uygun tür adları için Karma ad çözümlemesi bölümünde tablo olarak görüntülenir.
İç içe türleri çözümleme
İç içe geçmiş bir türse typeName
, yalnızca en dıştaki içeren türün adı öğesine typeResolver
geçirilir. Bu tür döndürüldüğünde typeResolver
, GetNestedType en iç içe yerleştirilmiş tür çözümlenene kadar yöntemi özyinelemeli olarak çağrılır.
Genel türleri çözümleme
GetType, genel türleri çözümlemek için özyinelemeli olarak çağrılır: Önce genel türün kendisini çözümlemek ve sonra da tür bağımsız değişkenlerini çözümlemek için. Tür bağımsız değişkeni genelse, GetType tür bağımsız değişkenlerini çözümlemek için özyinelemeli olarak çağrılır, vb.
Sağladığınız ve typeResolver
birleşimiassemblyResolver
, bu özyinelemenin tüm düzeylerini çözümleyebilecek durumda olmalıdır. Örneğin, yüklemesini MyAssembly
denetleen bir assemblyResolver
sağladığınızı varsayalım. Genel türü Dictionary<string, MyType>
(Dictionary(Of String, MyType)
Visual Basic'te) çözümlemek istediğinizi varsayalım. Aşağıdaki genel tür adını geçirebilirsiniz:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Tek derleme nitelikli tür bağımsız değişkeni olduğuna MyType
dikkat edin. ve String sınıflarının Dictionary<TKey,TValue> adları derlemeye uygun değildir. ve için alacağı null
için Dictionary<TKey,TValue>String, derleme veya null
işleyebilmelisiniztypeResolver
. Nitelenmemiş tür adlarının her ikisi de mscorlib.dll/System.Private.CoreLib.dll olduğundan, dize alan yöntemin aşırı yüklemesini GetType çağırarak bu durumu işleyebilir:
Type t = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore)
);
let t =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else null),
fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr))
Bu assemblyResolver
tür adları derleme nitelikli olmadığından, yöntem sözlük türü ve dize türü için çağrılmaz.
Şimdi, yerine System.String
ilk genel bağımsız değişken türünün ' den YourAssembly
olduğunu YourType
varsayalım:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Bu derleme ne mscorlib.dll/System.Private.CoreLib.dll ne de şu anda yürütülen derleme olmadığından, derleme nitelenmiş bir ad olmadan çözümleyemezsiniz YourType
. Özyinelemeli assemblyResolve
olarak çağrılacağından bu olayı işleyebilmelidir. dışındaki MyAssembly
derlemeler için döndürmek null
yerine artık sağlanan AssemblyName nesneyi kullanarak bir derleme yükü gerçekleştiriyor.
Type t2 = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
Assembly.Load(aName),
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore), true
);
let t2 =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else Assembly.Load aName),
(fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr)), true)
Özel karakterler içeren tür adlarını çözümleme
Bazı karakterlerin derleme nitelikli adlarında özel anlamları vardır. Basit bir tür adı bu karakterleri içeriyorsa, basit ad derleme nitelikli bir adın parçası olduğunda karakterler ayrıştırma hatalarına neden olur. Ayrıştırma hatalarından kaçınmak için, derlemenin nitelenmiş adını yönteme geçirebilmek için önce ters eğik çizgiyle özel karakterlerden GetType kaçınmanız gerekir. Örneğin, bir tür olarak adlandırılırsa Strange]Type
, çıkış karakteri köşeli ayraç önüne aşağıdaki gibi eklenmelidir: Strange\]Type
.
Not
Bu tür özel karakterlere sahip adlar Visual Basic veya C# dilinde oluşturulamaz, ancak ortak ara dil (CIL) kullanılarak veya dinamik derlemeler yayılarak oluşturulabilir.
Aşağıdaki tabloda, tür adları için özel karakterler gösterilmektedir.
Karakter | Anlamı |
---|---|
, (virgül) |
Derlemeye uygun adlar için sınırlayıcı. |
[] (köşeli ayraçlar) |
Sonek çifti olarak bir dizi türünü gösterir; bir sınırlayıcı çifti olarak, genel bağımsız değişken listelerini ve derleme nitelenmiş adlarını içine alır. |
& (ve işareti) |
Sonek olarak, bir türün bir başvuru türü olduğunu gösterir. |
* (yıldız işareti) |
Sonek olarak, bir türün işaretçi türü olduğunu gösterir. |
+ (artı) |
İç içe türler için sınırlayıcı. |
\ (ters eğik çizgi) |
Kaçış karakteri. |
Doğru kaçış dizeleri döndürme gibi AssemblyQualifiedName özellikler. Yönteme doğru kaçış dizeleri GetType geçirmeniz gerekir. Buna karşılık, GetType yöntem doğru kaçış adlarını typeResolver
varsayılan tür çözümleme yöntemlerine geçirir. Bir adı 'de typeResolver
bir adla birlikte olmayan bir adla karşılaştırmanız gerekiyorsa, kaçış karakterlerini kaldırmanız gerekir.
Karma ad çözümlemesi
Aşağıdaki tabloda, içindeki tüm tür adı ve derleme adı birleşimleri için , typeResolver
ve varsayılan ad çözümlemesi arasındaki assemblyResolver
etkileşimler özetlemektedirtypeName
:
Tür adının içeriği | Derleme çözümleyici yöntemi | Tür çözümleyici yöntemi | Sonuç |
---|---|---|---|
tür, derleme | null | null | Yöntem aşırı yüklemesini çağırmaya Type.GetType(String, Boolean, Boolean) eşdeğerdir. |
tür, derleme | sağlanan | boş | assemblyResolver derlemeyi döndürür veya derlemeyi çözümleyemediğinde döndürür null . Derleme çözümlenirse, Assembly.GetType(String, Boolean, Boolean) derlemeden türü yüklemek için yöntem aşırı yüklemesi kullanılır; aksi takdirde, türü çözümleme girişimi olmaz. |
tür, derleme | boş | sağlanan | Derleme adını bir AssemblyName nesneye dönüştürmeye ve derlemeyi almak için yöntem aşırı yüklemesini çağırmaya Assembly.Load(AssemblyName) eşdeğerdir. Derleme çözümlenirse öğesine geçirilir typeResolver ; aksi takdirde typeResolver çağrılmaz ve türü çözümlemeye başka bir girişim yoktur. |
tür, derleme | sağlanan | sağlanan | assemblyResolver derlemeyi döndürür veya derlemeyi çözümleyemediğinde döndürür null . Derleme çözümlenirse öğesine geçirilir typeResolver ; aksi takdirde typeResolver çağrılmaz ve türü çözümlemeye başka bir girişim yoktur. |
Tür | null, sağlanan | boş | Yöntem aşırı yüklemesini çağırmaya Type.GetType(String, Boolean, Boolean) eşdeğerdir. Derleme adı sağlanmadığından, yalnızca mscorlib.dll/System.Private.CoreLib.dll ve şu anda yürütülen derlemede arama yapılır. Sağlanırsa assemblyResolver yoksayılır. |
Tür | null, sağlanan | sağlanan | typeResolver çağrılır ve null derleme için geçirilir. typeResolver herhangi bir derlemeden bir tür sağlayabilir, bu nedenle yükler bütünleştirilmiş kodlar da dahil olmak üzere. Sağlanırsa assemblyResolver yoksayılır. |
derleme | null, sağlanan | null, sağlanan | Derleme FileLoadException adı, derleme nitelikli tür adıymış gibi ayrıştırıldığından, a oluşturulur. Bu, geçersiz bir derleme adıyla sonuç edilir. |