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öntemleri assemblyResolver 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, parametrenin throwOnError değeri varsayılan çözünürlüğü gerçekleştiren yöntemlere geçirilir.

  • isethrowOnError, bu yöntem döndürdüğünde ve TypeLoadException döndürdüğünde nulltypeResolvernullassemblyResolver bir FileNotFoundException oluşturur.true

  • Bu yöntem ve typeResolvertarafından assemblyResolver 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 typeNamedize 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 typeResolvergeç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 nulltypeResolverassemblyResolver çağrılmaz ve başka işlem gerçekleşmez; ayrıca, ise throwOnErrortruebir 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 assemblyResolvernulltypeResolver, çağrılmaz.

typeResolver yöntemi üç bağımsız değişken alır:

  • Aranacak derleme veya null derleme adı içermiyorsa typeName .
  • 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 throwOnErrortruedöndürürse nulltypeResolver, 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 typeResolvergeç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 MyAssemblydenetleen 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 nulliş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.Stringilk genel bağımsız değişken türünün ' den YourAssemblyolduğunu YourTypevarsayalı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 MyAssemblyderlemeler 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 typeResolverbir 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 , typeResolverve varsayılan ad çözümlemesi arasındaki assemblyResolveretkileş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.