Aracılığıyla paylaş


Yansıma ve genel türler

Yansıma açısından bakıldığında, genel bir tür ile sıradan bir tür arasındaki fark, genel bir türün onunla bir tür parametreleri kümesi (eğer bu bir genel tür tanımıysa) veya tür bağımsız değişkenleri (eğer bu bir yapılı türse) ile ilişkili olmasıdır. Genel bir yöntem, sıradan bir yöntemden aynı şekilde farklıdır.

Yansımanın genel türleri ve yöntemleri nasıl işlediğini anlamak için iki anahtar vardır:

  • Genel tür tanımlarının ve genel yöntem tanımlarının tür parametreleri sınıfın Type örnekleriyle temsil edilir.

    Uyarı

    Type'ün birçok özelliği ve yöntemi, bir Type nesnesi genel tür parametresini temsil ettiğinde farklı davranışlar sergiler. Bu farklılıklar özellik ve yöntem makalelerinde belgelenmiştir. Örneğin, bkz IsAutoClass . ve DeclaringType. Ayrıca, bazı üyeler yalnızca bir Type nesne genel tür parametresini temsil ettiğinde geçerlidir. Örnek için bkz. GetGenericTypeDefinition.

  • Type bir örnek genel bir türü temsil ediyorsa, genel tür tanımları için tür parametrelerini veya derlenmiş türler için tür bağımsız değişkenlerini temsil eden türlerden oluşan bir diziyi içerir. Aynı durum, genel bir yöntemi temsil eden sınıfın MethodInfo bir örneği için de geçerlidir.

Yansıma, Type ve MethodInfo yöntemlerini sağlayarak tür parametreleri dizisine erişmenize ve Type örneğinin bir tür parametresini mi yoksa gerçek bir türü mü temsil ettiğini belirlemenize olanak tanır.

Örneğin, burada ele alınan yöntemleri gösteren kod için, Nasıl Yapılır: Yansıma ile Genel Türleri İnceleme ve Örneklendirme?

Aşağıdaki tartışmada, tür parametreleri ve bağımsız değişkenler ile açık veya kapalı yapılı türler arasındaki fark gibi genel terimler hakkında bilgi sahibi olduğunuz varsayılır. Daha fazla bilgi için bkz. Genel Bilgiler.

Bu genel bir tür mü yoksa yöntem mi?

Bir örnek tarafından temsil edilen bilinmeyen bir türü incelemek için yansıma kullandığınızda, bu bilinmeyen türün genel olup olmadığını belirlemek için Type özelliğini kullanın. Eğer tür genelse, bu true döndürür. Benzer şekilde, MethodInfo sınıfının bir örneğiyle temsil edilen bilinmeyen bir metodu incelerken, metodun genel olup olmadığını belirlemek için IsGenericMethod özelliğini kullanın.

Bu genel bir tür mü yoksa yöntem tanımı mı?

Genel bir tür tanımını temsil edip etmediğini belirlemek için IsGenericTypeDefinition özelliğini ve genel bir yöntem tanımını temsil edip etmediğini belirlemek için Type yöntemini kullanın.

Genel tür ve yöntem tanımları, örneklenebilir türlerin oluşturulduğu şablonlardır. .NET kitaplıklarındaki genel türler, gibi Dictionary<TKey,TValue>genel tür tanımlarıdır.

Tür veya yöntem açık mı yoksa kapalı mı?

Örneklenebilir türler, tüm kapsayan türlerin tüm tür parametreleri de dahil olmak üzere tüm tür parametreleriyle değiştirildiyse genel bir tür veya yöntem kapatılır. Genel bir türün örneğini yalnızca kapalıysa oluşturabilirsiniz. Eğer bir tür açıksa, Type.ContainsGenericParameters özelliği true döndürür. Yöntemler için MethodBase.ContainsGenericParameters yöntemi aynı işlevi gerçekleştirir.

Kapalı genel türler oluşturma

Genel bir tür veya yöntem tanımına sahip olduktan sonra, kapalı bir genel tür oluşturmak için MakeGenericType yöntemini veya kapalı genel bir yöntemi oluşturmak için MakeGenericMethod yöntemini kullanınMethodInfo.

Genel tür veya yöntem tanımını alma

Genel tür veya yöntem tanımı olmayan açık bir genel türünüz veya yönteminiz varsa, bunun örneklerini oluşturamazsınız ve eksik olan tür parametrelerini sağlayamazsınız. Genel bir tür veya yöntem tanımına sahip olmanız gerekir. Genel tür tanımını almak için GetGenericTypeDefinition yöntemini veya genel yöntem tanımını almak için GetGenericMethodDefinition yöntemini kullanın.

Örneğin, Type temsil eden bir Dictionary<int, string> nesneniz varsa ve Dictionary<string, MyClass> türünü oluşturmak istiyorsanız, GetGenericTypeDefinition temsil eden bir Type elde etmek için Dictionary<TKey, TValue> yöntemini kullanabilir ve ardından MakeGenericType temsil eden bir Type üretmek için Dictionary<int, MyClass> yöntemini kullanabilirsiniz.

Genel bir tür olmayan açık bir tür örneği için bkz Tür parametresi veya tür argümanı.

Tür bağımsız değişkenlerini ve tür parametrelerini inceleyin

Genel bir türün tür parametrelerini veya tür bağımsız değişkenlerini temsil eden bir nesne dizisi elde etmek için Type.GetGenericArguments metodunu kullanın ve genel bir yöntem için aynı işlemi yapmak üzere Type metodunu kullanın.

Bir Type nesnenin tür parametresini temsil ettiğini bildiğinizde yansımanın yanıt verebileceği birçok ek soru vardır. Tür parametresinin kaynağını, konumunu ve kısıtlamalarını belirleyebilirsiniz.

Tür parametresi veya tür bağımsız değişkeni

Dizinin belirli bir öğesinin tür parametresi mi yoksa tür bağımsız değişkeni mi olduğunu belirlemek için özelliğini kullanın IsGenericParameter . IsGenericParameter öğesi bir tür parametresiyse özelliğidirtrue.

Genel bir tür, genel bir tür tanımı olmadan açık olabilir; bu durumda tür bağımsız değişkenleriyle tür parametrelerinin bir karışımına sahiptir. Örneğin, aşağıdaki kodda D sınıfı, D türünün ilk tür parametresinin B'nin ikinci tür parametresine ikame edilmesiyle oluşturulan bir türden türetilir.

class B<T, U> {}
class D<V, W> : B<int, V> {}
Class B(Of T, U)
End Class
Class D(Of V, W)
    Inherits B(Of Integer, V)
End Class

Temsil eden Type bir D<V, W> nesne alır ve temel türünü elde etmek için özelliğini kullanırsanızBaseType, sonuç type B<int, V> açık olur, ancak genel bir tür tanımı değildir.

Genel parametrenin kaynağı

Genel tür parametresi, incelediğiniz türden, kapsayan bir türden veya genel bir yöntemden gelebilir. Genel tür parametresinin kaynağını aşağıdaki gibi belirleyebilirsiniz:

  • İlk olarak, tür parametresinin DeclaringMethod genel bir yöntemden gelip geldiğini belirlemek için özelliğini kullanın. Özellik değeri null referans değilse, kaynak genel bir metottur.
  • Kaynak genel bir yöntem değilse, genel tür parametresinin ait olduğu genel türü belirlemek için DeclaringType özelliğini kullanın.

tür parametresi genel bir yönteme aitse, DeclaringType özelliği, ilgisiz olan genel yöntemi bildiren türü döndürür.

Genel parametrenin konumu

Nadir durumlarda, bildirimde bulunan sınıfının tür parametresi listesindeki bir tür parametresinin konumunu belirlemek gerekir. Örneğin, önceki örnekteki Type türü temsil eden bir B<int, V> nesneniz olduğunu varsayalım. GetGenericArguments yöntemi size tür bağımsız değişkenlerinin listesini verir ve incelediğinizde V ve DeclaringMethod özelliklerini kullanarak DeclaringType nereden geldiğini keşfedebilirsiniz. Ardından GenericParameterPosition , özelliğini kullanarak tanımlandığı tür parametresi listesinde konumunu belirleyebilirsiniz. Bu örnekte, V tanımlandığı tür parametresi listesinde 0 (sıfır) konumundadır.

Temel tür ve arabirim kısıtlamaları

GetGenericParameterConstraints Bir tür parametresinin temel tür kısıtlamasını ve arabirim kısıtlamalarını almak için yöntemini kullanın. Dizinin öğelerinin sırası önemli değildir. Bir öğe, arabirim türüyse arabirim kısıtlamasını temsil eder.

Genel parametre öznitelikleri

GenericParameterAttributes özelliği, varyansı (kovaryans veya kontravaryans) ve tür parametresinin özel kısıtlamalarını gösteren bir değer alırGenericParameterAttributes.

Kovaryans ve kontravaryans

Tür parametresinin kovaryant mı yoksa kontravaryant mı olduğunu belirlemek için, GenericParameterAttributes.VarianceMask maskesini GenericParameterAttributes özelliği tarafından döndürülen GenericParameterAttributes değerine uygulayın. Sonuç GenericParameterAttributes.None ise, tür parametresi sabittir. Daha fazla bilgi için bkz. Kovaryans ve Kontravaryans.

Özel kısıtlamalar

Tür parametresinin özel kısıtlamalarını belirlemek için maskeyi GenericParameterAttributes.SpecialConstraintMask özelliği tarafından döndürülen değere GenericParameterAttributesGenericParameterAttributes uygulayın. Sonuç ise GenericParameterAttributes.None, özel bir kısıtlama yoktur. Tür parametresi bir başvuru türü, null atanamaz bir değer türü ve parametresiz oluşturucuya sahip olmak için kısıtlanabilir.

Değişmezler

Genel türler için yansımadaki yaygın terimlere ilişkin sabit koşulların tablosu için bkz Type.IsGenericType. . Genel yöntemlerle ilgili ek terimler için bkz MethodBase.IsGenericMethod. .