Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Öznitelikler, meta verileri veya bildirim temelli bilgileri kodla (derlemeler, türler, yöntemler, özellikler vb.) ilişkilendirmek için güçlü bir yol sağlar. Bir özniteliği bir program varlığıyla ilişkilendirdikten sonra, yansıma adlı bir teknik kullanarak özniteliği çalışma zamanında sorgulayabilirsiniz.
Öznitelikler aşağıdaki özelliklere sahiptir:
- Öznitelikler programınıza meta veri ekler. Meta Veri, bir programda tanımlanan türler hakkında bilgidir. Tüm .NET derlemeleri, derlemede tanımlanan türleri ve tür üyelerini açıklayan belirtilen bir meta veri kümesi içerir. Diğer gerekli bilgileri belirtmek için özel öznitelikler ekleyebilirsiniz.
- Öznitelikler bütün derlemelere, modüllere veya sınıflar ve özellikler gibi daha küçük program öğelerine uygulanabilir.
- Öznitelikler, bağımsız değişkenleri yöntemler ve özelliklerle aynı şekilde kabul edebilir.
- Öznitelikler, bir programın yansıma kullanarak kendisinin veya diğer programların meta verilerini incelemesine olanak tanır.
Yansıma ile çalışma
Yansıma Tarafından Type sağlanan API'ler derlemeleri, modülleri ve türleri açıklar. Bir türün örneğini dinamik olarak oluşturmak, türü var olan bir nesneye bağlamak veya var olan bir nesneden türü almak ve yöntemlerini çağırmak ya da alanlarına ve özelliklerine erişmek için yansımayı kullanabilirsiniz. Kodunuzda öznitelikleri kullandığınızda, yansıma bunlara erişmenizi sağlar. Daha fazla bilgi için bkz. Öznitelikleri.
İşte GetType() ile basit bir yansıma örneği. Temel sınıftaki tüm türler, bir değişkenin Object
türünü almak için kullanılan bu yöntemi devralır:
Not
C# (using System;
) kod dosyanızın en üstüne using System.Reflection;
ve deyimlerini eklediğinizden emin olun.
// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);
Çıktı şöyle bir tür gösterir:
System.Int32
Aşağıdaki örnek, yüklenen derlemenin tam adını almak için yansımayı kullanır.
// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);
Çıktı aşağıdaki örneğe benzer:
System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
IL için anahtar sözcük farklılıkları
C# anahtar sözcüklerinin protected
internal
Ara Dilde (IL) bir anlamı yoktur ve yansıma API'lerinde kullanılmaz. IL'deki ilgili terimler Family ve Assembly'dır. Bu terimleri kullanmanın bazı yolları şunlardır:
- Bir
internal
yöntemini yansıma kullanarak tanımlamak için IsAssembly özelliğini kullanın. - bir
protected internal
yöntemini tanımlamak için IsFamilyOrAssemblykullanın.
Özniteliklerle çalışma
Öznitelikler neredeyse tüm bildirimlere yerleştirilebilir, ancak belirli bir öznitelik geçerli olduğu bildirim türlerini kısıtlayabilir. C# dilinde, özniteliğin adını uygulandığı varlığın bildiriminin üzerine köşeli ayraç ([]
) içine alarak belirtirsiniz.
Bu örnekte, sınıfına belirli bir özelliği uygulamak için özniteliğini SerializableAttribute kullanırsınız:
[Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
Özniteliğiyle DllImportAttribute bir yöntem bildirebilirsiniz:
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
Bir bildirime birden çok öznitelik yerleştirebilirsiniz:
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Belirli bir varlık için bazı öznitelikler birden çok kez belirtilebilir. Aşağıdaki örnekte özniteliğin çok kullanımlı olduğu gösterilmektedir ConditionalAttribute :
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
Not
Kural gereği, tüm öznitelik adları .NET kitaplıklarındaki diğer türlerden ayırt etmek için "Öznitelik" soneki ile biter. Ancak, kodda öznitelikleri kullanırken öznitelik son ekini belirtmeniz gerekmez. Örneğin, bir [DllImport]
bildirim bir [DllImportAttribute]
bildirime eşdeğerdir, ancak DllImportAttribute
.NET Sınıf Kitaplığı'ndaki sınıfın gerçek adıdır.
Öznitelik parametreleri
Birçok özniteliğin konumsal, adsız veya adlandırılmış olabilecek parametreleri vardır. Aşağıdaki tabloda, adlandırılmış ve konumsal özniteliklerle nasıl çalışıldığı açıklanmaktadır:
Konumsal parametreler
Öznitelik oluşturucusunun parametreleri:
Adlandırılmış parametreler
Özniteliğin özellikleri veya alanları:
- Belirtilmelidir, atlayamaz
- Her zaman önce belirtin
- Belirli bir sırayı belirtin
- Her zaman isteğe bağlı, yanlış olduğunda atla
- Konumsal parametrelerden sonra belirtin
- Herhangi bir sırada belirtin
Örneğin, aşağıdaki kod üç eşdeğer DllImport
özniteliği gösterir:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
İlk parametre olan DLL adı konumsaldır ve her zaman önce gelir. Diğer örnekler parametre olarak adlandırılır. Bu senaryoda, her iki adlandırılmış parametre de varsayılan olarak false olur, böylece atlanabilirler. Varsayılan parametre değerleri hakkında bilgi için tek tek özniteliğin belgelerine bakın. İzin verilen parametre türleri hakkında daha fazla bilgi için C# dil belirtimininÖznitelikler bölümüne bakın.
Öznitelik hedefleri
Bir özniteliğin hedefi , özniteliğin uygulandığı varlıktır. Örneğin, bir öznitelik bir sınıfa, yönteme veya derlemeye uygulanabilir. Varsayılan olarak, bir öznitelik onu izleyen öğeye uygulanır. Ancak, ilişkilendirmek için bir yöntem, parametre veya dönüş değeri gibi öğeyi açıkça tanımlayabilirsiniz.
Bir öznitelik hedefini açıkça tanımlamak için aşağıdaki söz dizimini kullanın:
[target : attribute-list]
Aşağıdaki tabloda olası target
değerlerin listesi gösterilmektedir.
Hedef değer | Şunun için geçerlidir: |
---|---|
assembly |
Bütün montaj |
module |
Geçerli montaj modülü |
field |
Bir sınıfta veya yapıda alan |
event |
Etkinlik |
method |
Yöntem veya get ve set özellik erişimcileri |
param |
Yöntem parametreleri veya set özellik erişimcisi parametreleri |
property |
Mülk |
return |
Bir yöntemin, özellik dizin oluşturucusunun veya get özellik erişimcisinin dönüş değeri |
type |
Yapı, sınıf, arayüz, enum veya temsilci |
field
için oluşturulan yedekleme alanına öznitelik uygulamak için hedef değeri belirtebilirsiniz.
Aşağıdaki örnekte, derlemelere ve modüllere özniteliklerin nasıl uygulanacağı gösterilmektedir. Daha fazla bilgi için bkz . Ortak öznitelikler (C#).
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
Aşağıdaki örnekte, C# dilinde yöntemlere, yöntem parametrelerine ve yöntem dönüş değerlerine özniteliklerin nasıl uygulanacağı gösterilmektedir.
// default: applies to method
[ValidatedContract]
int Method1() { return 0; }
// applies to method
[method: ValidatedContract]
int Method2() { return 0; }
// applies to parameter
int Method3([ValidatedContract] string contract) { return 0; }
// applies to return value
[return: ValidatedContract]
int Method4() { return 0; }
Not
Özniteliğin geçerli olarak tanımlandığı ValidatedContract
hedeflerden bağımsız olarak, return
öznitelik yalnızca dönüş değerlerine uygulanacak şekilde tanımlanmış olsa bile hedefin ValidatedContract
belirtilmesi gerekir. Başka bir deyişle, derleyici AttributeUsage
bilgilerini belirsiz öznitelik hedeflerini çözümlemek için kullanmaz. Daha fazla bilgi için bkz. AttributeUsage.
Öznitelikleri kullanmanın yollarını gözden geçirin
Kodda öznitelikleri kullanmanın bazı yaygın yolları şunlardır:
- Denetleyici yöntemlerini POST iletilerine yanıt veren özniteliği olan
HttpPost
kullanarak işaretleyin. Daha fazla bilgi için sınıfına HttpPostAttribute bakın. - Yerel kodla birlikte çalışırken yöntem parametrelerinin nasıl sıralandığı açıklanmaktadır. Daha fazla bilgi için sınıfına MarshalAsAttribute bakın.
- Sınıflar, yöntemler ve arabirimler için Bileşen Nesne Modeli (COM) özelliklerini açıklama.
- sınıfını kullanarak yönetilmeyen kodu çağırın DllImportAttribute .
- Derlemenizi başlık, sürüm, açıklama veya ticari marka açısından açıklayın.
- Kalıcılık için bir sınıfın hangi üyelerini serileştirebileceğinizi açıklayın.
- XML serileştirmesi için sınıf üyeleriyle XML düğümleri arasında eşlemeyi açıklayın.
- Yöntemler için güvenlik gereksinimlerini açıklayın.
- Güvenliği sağlamak için kullanılan özellikleri belirtin.
- Kodun hata ayıklaması kolay kalması için tam zamanında (JIT) derleyicisi ile iyileştirmeleri kontrol edin.
- Bir yöntemi çağıran kişi hakkında bilgi alın.
Yansıma senaryolarını gözden geçirme
Yansıma aşağıdaki senaryolarda kullanışlıdır:
- Programınızın meta verilerindeki özniteliklere erişin. Daha fazla bilgi için bkz. Özniteliklerde depolanan bilgileri alma.
- Derleme birimdeki türleri inceleme ve örnek oluşturma.
- Çalışma zamanında System.Reflection.Emit ad alanındaki sınıfları kullanarak yeni türler oluşturun.
- Çalışma zamanında oluşturulan türlerde geç bağlama ve erişim yöntemleri gerçekleştirin. Daha fazla bilgi için bkz. Türleri dinamik olarak yükleme ve kullanma.