Apa itu atribut di .NET, untuk apa atributnya, dan bagaimana cara membuat atribut saya sendiri?
sumber
Apa itu atribut di .NET, untuk apa atributnya, dan bagaimana cara membuat atribut saya sendiri?
Metadata. Data tentang objek / metode / properti Anda.
Sebagai contoh, saya dapat mendeklarasikan atribut yang disebut: DisplayOrder sehingga saya dapat dengan mudah mengontrol properti urutan apa yang akan muncul di UI. Saya kemudian dapat menambahkannya ke kelas dan menulis beberapa komponen GUI yang mengekstrak atribut dan memesan elemen UI dengan tepat.
public class DisplayWrapper
{
private UnderlyingClass underlyingObject;
public DisplayWrapper(UnderlyingClass u)
{
underlyingObject = u;
}
[DisplayOrder(1)]
public int SomeInt
{
get
{
return underlyingObject .SomeInt;
}
}
[DisplayOrder(2)]
public DateTime SomeDate
{
get
{
return underlyingObject .SomeDate;
}
}
}
Dengan demikian memastikan bahwa SomeInt selalu ditampilkan sebelum SomeDate ketika bekerja dengan komponen GUI khusus saya.
Namun, Anda akan melihatnya paling sering digunakan di luar lingkungan pengkodean langsung. Misalnya Desainer Windows menggunakannya secara luas sehingga ia tahu cara menangani objek yang dibuat khusus. Menggunakan BrowsableAttribute seperti:
[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
get{/*do something*/}
}
Memberitahu desainer untuk tidak mencantumkan ini di properti yang tersedia di jendela Properties pada waktu desain misalnya.
Anda juga bisa menggunakannya untuk operasi pembuatan kode, pra-kompilasi (seperti Pasca-Tajam) atau operasi run-time seperti Reflection.Emit. Misalnya, Anda dapat menulis sedikit kode untuk pembuatan profil yang secara transparan membungkus setiap panggilan yang dilakukan oleh kode Anda dan dikalikan dengan waktu. Anda bisa "menyisih" dari penentuan waktu melalui atribut yang Anda tempatkan pada metode tertentu.
public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
bool time = true;
foreach (Attribute a in target.GetCustomAttributes())
{
if (a.GetType() is NoTimingAttribute)
{
time = false;
break;
}
}
if (time)
{
StopWatch stopWatch = new StopWatch();
stopWatch.Start();
targetMethod.Invoke(target, args);
stopWatch.Stop();
HandleTimingOutput(targetMethod, stopWatch.Duration);
}
else
{
targetMethod.Invoke(target, args);
}
}
Mendeklarasikannya itu mudah, cukup buat kelas yang mewarisi dari Atribut.
public class DisplayOrderAttribute : Attribute
{
private int order;
public DisplayOrderAttribute(int order)
{
this.order = order;
}
public int Order
{
get { return order; }
}
}
Dan ingat bahwa ketika Anda menggunakan atribut Anda dapat menghilangkan suffix "atribut" kompiler akan menambahkannya untuk Anda.
CATATAN: Atribut tidak melakukan apa pun sendiri - perlu ada beberapa kode lain yang menggunakannya. Terkadang kode itu telah ditulis untuk Anda tetapi kadang-kadang Anda harus menulisnya sendiri. Sebagai contoh, kompiler C # peduli tentang beberapa dan kerangka kerja tertentu menggunakan beberapa kerangka kerja (mis. NUnit mencari [TestFixture] pada suatu kelas dan [Uji] pada metode pengujian saat memuat sebuah rakitan).
Jadi, ketika membuat atribut khusus Anda sendiri, ketahuilah bahwa itu tidak akan memengaruhi perilaku kode Anda sama sekali. Anda harus menulis bagian lain yang memeriksa atribut (melalui refleksi) dan menindaklanjutinya.
Banyak orang telah menjawab tetapi belum ada yang menyebutkan ini sejauh ini ...
Atribut banyak digunakan dengan refleksi. Refleksi sudah cukup lambat.
Sangat berharga menandai atribut kustom Anda sebagai
sealed
kelas untuk meningkatkan kinerja runtime mereka.Ini juga merupakan ide yang baik untuk mempertimbangkan di mana tempat yang tepat untuk menggunakan atribut seperti itu, dan untuk atribut atribut Anda (!) Untuk menunjukkan ini melalui
AttributeUsage
. Daftar penggunaan atribut yang tersedia mungkin mengejutkan Anda:Itu juga keren bahwa atribut AttributeUsage adalah bagian dari tanda tangan atribut AttributeUsage. Whoa untuk dependensi melingkar!
sumber
Atribut adalah sejenis data meta untuk kelas penandaan. Ini sering digunakan dalam WinForms misalnya untuk menyembunyikan kontrol dari toolbar, tetapi dapat diimplementasikan dalam aplikasi Anda sendiri untuk memungkinkan instance dari kelas yang berbeda untuk berperilaku dengan cara tertentu.
Mulai dengan membuat atribut:
Semua kelas atribut harus memiliki akhiran "Atribut" agar valid.
Setelah ini selesai, buat kelas yang menggunakan atribut.
Sekarang Anda dapat memeriksa kelas tertentu '
SortOrderAttribute
(jika ada) dengan melakukan hal berikut:Jika Anda ingin membaca lebih lanjut tentang ini, Anda selalu dapat memeriksa MSDN yang memiliki deskripsi yang cukup bagus.
Saya harap ini membantu Anda!
sumber
Atribut adalah kelas yang berisi sedikit fungsionalitas yang dapat Anda terapkan ke objek dalam kode Anda. Untuk membuatnya, buat kelas yang mewarisi dari System.Attribute.
Adapun apa yang mereka baik untuk ... ada kegunaan yang hampir tak terbatas untuk mereka.
http://www.codeproject.com/KB/cs/dotnetattributes.aspx
sumber
Atribut seperti metadata yang diterapkan pada kelas, metode, atau rakitan.
Mereka baik untuk sejumlah hal (visualisasi debugger, menandai hal-hal sebagai usang, menandai hal-hal sebagai serializable, daftarnya tidak ada habisnya).
Membuat yang Anda kustom sendiri semudah pie. Mulai di sini:
http://msdn.microsoft.com/en-us/library/sw480ze8(VS.71).aspx
sumber
Dalam proyek yang sedang saya kerjakan, ada satu set objek UI dari berbagai rasa dan editor untuk merakit objek-objek ini untuk membuat halaman untuk digunakan dalam aplikasi utama, sedikit seperti perancang formulir di DevStudio. Objek-objek ini ada dalam rakitan mereka sendiri dan setiap objek adalah kelas yang berasal dari
UserControl
dan memiliki atribut khusus. Atribut ini didefinisikan seperti ini:dan saya menerapkannya ke kelas seperti ini:
itulah yang dikatakan oleh poster sebelumnya.
Untuk menggunakan atribut, editor memiliki
Generic::List <Type>
tipe kontrol yang berisi. Ada kotak daftar di mana pengguna dapat menarik dari dan menjatuhkan ke halaman untuk membuat turunan kontrol. Untuk mengisi kotak daftar, saya mendapatkanControlDescriptionAttribute
untuk kontrol dan mengisi entri dalam daftar:Catatan: di atas adalah C ++ / CLI tetapi tidak sulit untuk mengkonversi ke C # (yeah, saya tahu, C ++ / CLI adalah kekejian tapi itu yang harus saya kerjakan dengan :-()
Anda dapat menempatkan atribut pada sebagian besar hal dan ada berbagai macam atribut yang telah ditentukan. Editor yang disebutkan di atas juga mencari atribut khusus pada properti yang menggambarkan properti dan cara mengeditnya.
Setelah Anda mendapatkan seluruh ide, Anda akan bertanya-tanya bagaimana Anda bisa hidup tanpanya.
sumber
Seperti yang dikatakan, Atribut relatif mudah dibuat. Bagian lain dari karya ini adalah membuat kode yang menggunakannya. Dalam kebanyakan kasus, Anda akan menggunakan refleksi pada saat runtime untuk mengubah perilaku berdasarkan keberadaan atribut atau propertinya. Ada juga skenario di mana Anda akan memeriksa atribut pada kode yang dikompilasi untuk melakukan semacam analisis statis. Misalnya, parameter mungkin ditandai sebagai bukan nol dan alat analisis dapat menggunakan ini sebagai petunjuk.
Menggunakan atribut dan mengetahui skenario yang sesuai untuk penggunaannya adalah sebagian besar pekerjaan.
sumber
Atribut pada dasarnya adalah bit data yang ingin Anda lampirkan ke tipe Anda (kelas, metode, peristiwa, enum, dll.)
Idenya adalah bahwa pada saat dijalankan beberapa jenis / kerangka / alat lain akan meminta Anda tipe untuk informasi dalam atribut dan menindaklanjutinya.
Jadi, misalnya, Visual Studio dapat meminta atribut pada kontrol pihak ke-3 untuk mencari tahu properti kontrol mana yang akan muncul di panel Properties pada waktu desain.
Atribut juga dapat digunakan dalam Pemrograman Berorientasi Aspek untuk menyuntikkan / memanipulasi objek pada waktu berjalan berdasarkan atribut yang menghiasinya dan menambahkan validasi, pencatatan, dll. Ke objek tanpa mempengaruhi logika bisnis objek.
sumber
Anda dapat menggunakan atribut khusus sebagai cara sederhana untuk menentukan nilai tag di sub-kelas tanpa harus menulis kode yang sama berulang-ulang untuk setiap subkelas. Saya menemukan contoh ringkas yang bagus dari John Waters tentang cara mendefinisikan dan menggunakan atribut khusus dalam kode Anda sendiri.
Ada tutorial di http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx
sumber
Untuk mulai membuat atribut, buka file sumber C #, ketik
attribute
dan tekan [TAB]. Ini akan diperluas ke templat untuk atribut baru.sumber
Atribut juga biasa digunakan untuk Pemrograman Berorientasi Aspek. Untuk contoh ini, periksa proyek PostSharp .
sumber