Düşünceler 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 (genel tür tanımıysa) veya tür bağımsız değişkenleriyle (yapılı bir türse) ilişkilendirmiş 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.
Not
Birçok özelliği ve yöntemi, bir Type nesne genel tür parametresini temsil ettiğinde farklı davranışlara Type sahiptir. Bu farklılıklar özellik ve yöntem makalelerinde belgelenmiştir. Örnek iç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.
bir örneği Type genel bir türü temsil ederse, tür parametrelerini (genel tür tanımları için) veya tür bağımsız değişkenlerini (derlenmiş türler için) temsil eden bir tür dizisi içerir. Aynı durum, genel bir yöntemi temsil eden sınıfın MethodInfo bir örneği için de geçerlidir.
Düşünceler ion, tür parametreleri dizisine erişmenize ve örneğinin Type bir tür parametresini mi yoksa gerçek bir türü mü temsil ettiğini saptamanıza olanak sağlayan ve yöntemlerini TypeMethodInfo sağlar.
Burada ele alınan yöntemleri gösteren kod için bkz. Nasıl yapılır: Düşünceler ion ile Genel Türleri İnceleme ve Örneği Oluşturma.
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 örneği tarafından temsil edilen bilinmeyen bir türü incelemek için yansıma kullandığınızda, bilinmeyen türün TypeIsGenericType genel olup olmadığını belirlemek için özelliğini kullanın. Tür genelse döndürür true
. Benzer şekilde, sınıfın bir örneği tarafından temsil edilen bilinmeyen bir yöntemi incelediğinizde, yönteminin MethodInfoIsGenericMethod genel olup olmadığını belirlemek için özelliğini kullanın.
Bu genel bir tür mü yoksa yöntem tanımı mı?
Bir nesnenin IsGenericTypeDefinition genel bir tür tanımını temsil edip etmediğini Type belirlemek için özelliğini ve genel bir yöntem tanımını temsil edip etmediğini MethodInfo belirlemek için yöntemini kullanınIsGenericMethodDefinition.
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. Type.ContainsGenericParameters Bir tür açıksa özelliği döndürürtrue
. Yöntemler için yöntemi MethodBase.ContainsGenericParameters 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 yöntemini veya MakeGenericMethod kapalı genel bir yöntem için oluşturma MethodInfo yöntemini kullanınMakeGenericType.
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. GetGenericTypeDefinition Genel tür tanımını almak için yöntemini veya GetGenericMethodDefinition genel yöntem tanımını almak için yöntemini kullanın.
Örneğin, temsil eden bir Type nesneniz varsa ve türünü Dictionary<string, MyClass>
oluşturmak istiyorsanız, bir temsili Dictionary<TKey, TValue>
almak Type için yöntemini kullanabilir GetGenericTypeDefinition ve ardından temsil eden Dictionary<int, MyClass>
bir Type oluşturmak için yöntemini kullanabilirsinizMakeGenericType.Dictionary<int, string>
Genel tür olmayan açık bir genel tür örneği için bkz . Tür parametresi veya tür bağımsız değişkeni.
Tür bağımsız değişkenlerini ve tür parametrelerini inceleme
Genel bir türün Type.GetGenericArgumentsType tür parametrelerini veya tür bağımsız değişkenlerini temsil eden bir nesne dizisi elde etmek için yöntemini kullanın ve genel bir yöntem için aynı işlemi yapmak için yöntemini kullanın MethodInfo.GetGenericArguments .
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 sınıfı D
, ikinci tür parametresi için ilk tür parametresini D
değiştirerek oluşturulan bir türden B
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
generic<typename T, typename U> ref class B {};
generic<typename V, typename W> ref class D : B<int, V> {};
Temsil eden D<V, W>
bir Type 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 başvuru değilse, kaynak genel bir yöntemdir.
- Kaynak genel bir yöntem değilse, genel tür parametresinin DeclaringType ait olduğu genel türü belirlemek için ö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 B<int, V>
türü temsil eden bir Type nesneniz olduğunu varsayalım. GetGenericArguments yöntemi size tür bağımsız değişkenlerinin listesini verir ve incelediğinizde V
ve DeclaringType özelliklerini kullanarak DeclaringMethod 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 birlikte değişken mi yoksa değişken karşıtı mı olduğunu belirlemek için, maskeyi GenericParameterAttributes.VarianceMask özelliği tarafından döndürülen değere GenericParameterAttributesGenericParameterAttributes uygulayın. Sonuç ise GenericParameterAttributes.Nonetür parametresi sabittir. Daha fazla bilgi için bkz . Kovaryans ve Contravariance.
Ö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.
Invariants
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. .