Aracılığıyla paylaş


System.Type.GetType yöntemleri

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) metodunun varsayılan uygulamasını daha esnek uygulamalarla değiştirmek için metot aşırı yüklemesi GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) ve onun ilişkili aşırı yüklemelerini (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean) ve GetType) 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 türün hangi derleme 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 System.Type alt sınıflarını döndürün.

Ö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ı, CLR tarafından oluşturulmayan System.Type alt sınıflarını döndürmek zorunda kalabilir; yöntemin farklı aşırı yüklemeleri 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, typeName ifadesini bir türün adı ve bir derlemenin adı olarak ayrıştırır ve ardından 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.

Uyarı

Derleme nitelikli tür adları kavramını bilmiyorsanız AssemblyQualifiedName özelliğine bakın.

Derlemeye uygun bir ad değilse typeName , derleme çözümlemesi atlanır. Vasıflandırılmamış tür adları mscorlib.dll/System.Private.CoreLib.dll veya şu anda yürütülen çalışma derlemesi bağlamında çözümlenebilir. Ayrıca isteğe bağlı olarak typeResolver parametresinde 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 yöntemleri assemblyResolver veya typeResolver iletmeyin. 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 assemblyResolver parametrelerini atlarsanıztypeResolver, parametrenin throwOnError değeri varsayılan çözünürlüğü gerçekleştiren yöntemlere geçirilir.

  • Eğer throwOnErrortrue ise, bu yöntem TypeLoadExceptiontypeResolver döndüğünde bir null, ve FileNotFoundExceptionassemblyResolver döndüğünde bir null oluşturur.

  • Bu yöntem assemblyResolver ve typeResolver tarafından oluşturulan özel durumları yakalamaz. Çözümleyici metodların fırlattığı istisnalardan siz sorumlusunuz.

Derlemeleri çözme

assemblyResolver yöntemi, AssemblyName içinde bulunan dize derleme adını ayrıştırarak üretilen bir typeName nesnesi alır. typeName bir derleme adı içermiyorsa, assemblyResolver çağrılmaz ve null, typeResolver öğesine aktarılır.

assemblyResolver Sağlanmazsa, derlemeyi bulmak için standart derleme araması kullanılır. Sağlanırsa assemblyResolver, GetType yöntem standart yoklama yapmaz; bu durumda, yönteminizin kendisine geçirdiğiniz tüm derlemeleri işleyebilmesini sağladığınızdan assemblyResolver emin olmanız gerekir.

Derleme çözümlenemiyorsa assemblyResolver yöntemi null döndürmelidir. Eğer assemblyResolvernull döndürürse, typeResolver çağrılmaz ve başka işlem gerçekleşmez; ayrıca, eğer throwOnErrortrue ise, bir FileNotFoundException atılır.

AssemblyName olarak geçirilen assemblyResolver kısmi bir ad ise, bölümlerinin biri veya daha fazlası null olabilir. Örneğin, bir sürümü yoksa, Version özelliği null olur. Version özelliği, CultureInfo özelliği ve GetPublicKeyToken yönteminin tümü null döndürürse, yalnızca derlemenin basit adı sağlanır. assemblyResolver yöntemi derlem adının tüm kısımlarını kullanabilir veya göz ardı edebilir.

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 çözmek

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. Eğer assemblyResolver veya standart derleme yoklama işlevi null döndürürse, typeResolver ç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 büyük/küçük harf durumunun göz ardı edilip edilmeyeceğini belirten bir Boole değeri.

Uygulama, bu bağımsız değişkenlerin nasıl kullanıldığını belirler. typeResolver yöntemi, türü çözümleyemediğinde null döndürmelidir. Eğer typeResolvernull döndürürse ve throwOnErrortrue ise, bu aşırı yüklemesi GetType bir TypeLoadException oluş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 çözmek

İç içe geçmiş bir türse, yalnızca en dıştaki içeren türün adı typeName'e geçirilir. typeResolver bu türü döndürdüğünde, GetNestedType yöntemi, en içteki iç içe yerleştirilmiş tür çözümlenene kadar ö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.

assemblyResolver ve typeResolver birleşimi, sağladığınız bu özyinelemenin tüm düzeylerini çözümleyebilecek durumda olmalıdır. Örneğin, yüklemesini assemblyResolverdenetleen bir MyAssembly 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]]"

MyType tek derleme nitelikli tür bağımsız değişkeni olduğuna dikkat edin. Dictionary<TKey,TValue> ve String sınıflarının adları derlemeye uygun olarak nitelendirilmemiştir. typeResolver'unuzun hem bir derlemeyi hem de null işleyebilmesi gerekir, çünkü null ve Dictionary<TKey,TValue> için String alacaktır. Nitelenmemiş tür adlarının GetType her ikisi de mscorlib.dll/System.Private.CoreLib.dlliçinde olduğundan, dize alan yöntemin aşırı yüklemesini ç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 tür adları derleme nitelikli olmadığından, assemblyResolver yöntemi sözlük türü ve dize türü için çağrılmaz.

Şimdi, System.String yerine, ilk genel bağımsız değişken türünün YourType'den YourAssembly olduğunu varsayalım:

"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"

Bu bütünleşim ne mscorlib.dll/System.Private.CoreLib.dll ne de şu anda yürütülen bütünleşim olmadığından, bütünleşim nitelenmiş bir ad olmadan YourType çözümlenemez. Çünkü assemblyResolve'iniz özyinelemeli olarak çağrılacağından, bu durumu yönetebilmelidir. diğer null derlemeleri için MyAssembly döndürmek 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 isimlerde özel anlamları vardır. Basit bir tür adı bu karakterleri içeriyorsa, bu karakterler, o basit adın derleme nitelikli bir adın parçası olduğunda 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 Strange]Type olarak adlandırıldıysa, kaçış karakteri köşeli ayraçların önüne aşağıdaki gibi eklenmelidir: Strange\]Type.

Uyarı

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) Son ek çifti olarak bir dizi türünü belirtir; bir sınırlayıcı çifti olarak ise genel argüman listelerini ve derleme nitelenmiş adlarını içine alır.
& (ve işareti) Ek olarak, bir türün bir referans 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 kaçış dizelerini doğru şekilde 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. typeResolver öğesinde bir adı kaçış karakteri kullanılmamış bir adla karşılaştırmanız gerekiyorsa, kaçış karakterlerini kaldırmanız gerekir.

Karma ad çözümlemesi

Aşağıdaki tablo, assemblyResolver içindeki tüm tür adı ve derleme adı birleşimleri için, typeResolver, typeName ve varsayılan ad çözümlemesi arasındaki etkileşimleri özetlemektedir.

Tür adının içeriği Derleme çözümleyici yöntemi Tür çözümleyici yöntemi Sonuç
tür, derleme sıfır sıfır Type.GetType(String, Boolean, Boolean) yöntem aşırı yüklemesinin çağrılmasına eşdeğerdir.
tür, derleme Sağlanan sıfır assemblyResolver derlemeyi döndürür veya derlemeyi çözümleyemezse null döndürür. Derleme çözümlenirse, Assembly.GetType(String, Boolean, Boolean) derlemeden türü yüklemek için metot aşırı yüklemesi kullanılır; aksi takdirde türü çözme girişiminde bulunulmaz.
tür, derleme sıfır Sağlanan Bir derleme adının bir AssemblyName nesneye dönüştürülmesi ve derlemeyi almak için Assembly.Load(AssemblyName) metot aşırı yüklemesinin çağrılmasıyla eşdeğerdir. Bütünleştirme çözümlenirse typeResolver iletilir; aksi takdirde typeResolver çağrılmaz ve türü çözümlemek için başka bir girişimde bulunulmaz.
tür, derleme Sağlanan Sağlanan assemblyResolver derlemeyi döndürür veya derlemeyi çözümleyemezse null döndürür. Bütünleştirme çözümlenirse typeResolver iletilir; aksi takdirde typeResolver çağrılmaz ve türü çözümlemek için başka bir girişimde bulunulmaz.
tür null, sağlandı sıfır Type.GetType(String, Boolean, Boolean) yöntem aşırı yüklemesinin çağrılmasına 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. assemblyResolver sağlanmışsa, yoksayılır.
tür null, sağlandı Sağlanan typeResolver çağrılır ve null derleme için geçirilir. typeResolver herhangi bir derlemeden, amacı doğrultusunda yüklediği derlemeler de dahil olmak üzere, bir tür sağlayabilir. assemblyResolver sağlanmışsa, yoksayılır.
toplantı null, sağlandı null, sağlandı Derleme adı, derleme nitelikli tür adıymış gibi ayrıştırıldığından bir FileLoadException atılır. Bu, geçersiz bir derleme adıyla sonuç edilir.