Ini sepertinya menyiratkan "tidak". Yang sangat disayangkan.
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class,
AllowMultiple = true, Inherited = true)]
public class CustomDescriptionAttribute : Attribute
{
public string Description { get; private set; }
public CustomDescriptionAttribute(string description)
{
Description = description;
}
}
[CustomDescription("IProjectController")]
public interface IProjectController
{
void Create(string projectName);
}
internal class ProjectController : IProjectController
{
public void Create(string projectName)
{
}
}
[TestFixture]
public class CustomDescriptionAttributeTests
{
[Test]
public void ProjectController_ShouldHaveCustomDescriptionAttribute()
{
Type type = typeof(ProjectController);
object[] attributes = type.GetCustomAttributes(
typeof(CustomDescriptionAttribute),
true);
// NUnit.Framework.AssertionException: Expected: 1 But was: 0
Assert.AreEqual(1, attributes.Length);
}
}
Bisakah kelas mewarisi atribut dari antarmuka? Atau apakah saya menggonggong pohon yang salah di sini?
c#
attributes
Roger Lipscombe
sumber
sumber
Anda dapat menentukan metode ekstensi yang berguna ...
Berikut adalah metode ekstensi:
Memperbarui:
Berikut adalah versi yang lebih pendek seperti yang diusulkan oleh SimonD dalam sebuah komentar:
sumber
Apply
dengan built inForEach
dariMicrosoft.Practices.ObjectBuilder2
Sebuah artikel oleh Brad Wilson tentang ini: Atribut Antarmuka! = Atribut Kelas
Untuk meringkas: kelas tidak mewarisi dari antarmuka, mereka menerapkannya. Artinya, atribut tidak secara otomatis menjadi bagian dari implementasi.
Jika Anda perlu mewarisi atribut, gunakan kelas dasar abstrak, bukan antarmuka.
sumber
Sementara kelas C # tidak mewarisi atribut dari antarmukanya, ada alternatif yang berguna saat mengikat model di ASP.NET MVC3.
Jika Anda mendeklarasikan model tampilan sebagai antarmuka dan bukan tipe konkret, maka tampilan dan pengikat model akan menerapkan atribut (misalnya,
[Required]
atau[DisplayName("Foo")]
dari antarmuka saat merender dan memvalidasi model:Kemudian dalam tampilan:
sumber
Ini lebih untuk orang yang ingin mengekstrak atribut dari properti yang mungkin ada pada antarmuka yang diterapkan. Karena atribut tersebut bukan bagian dari kelas, ini akan memberi Anda akses ke sana. perhatikan, saya memiliki kelas kontainer sederhana yang memberi Anda akses ke PropertyInfo - karena untuk itulah saya membutuhkannya. Retas sesuai kebutuhan. Ini bekerja dengan baik untuk saya.
sumber
EDIT: ini mencakup mewarisi atribut dari antarmuka pada anggota (termasuk properti). Ada jawaban sederhana di atas untuk definisi tipe. Saya baru saja memposting ini karena menurut saya itu batasan yang menjengkelkan dan ingin membagikan solusi :)
Antarmuka adalah beberapa pewarisan dan berperilaku sebagai pewarisan dalam sistem tipe. Tidak ada alasan bagus untuk hal semacam ini. Refleksi agak tipu. Saya telah menambahkan komentar untuk menjelaskan omong kosong tersebut.
(Ini adalah .NET 3.5 karena ini kebetulan yang digunakan oleh proyek yang saya lakukan saat ini.)
Tes NUnit Barebones
sumber
Tambahkan antarmuka dengan properti yang memiliki atribut / atribut khusus yang dilampirkan ke properti yang sama dengan yang dimiliki kelas. Kita dapat mengekstrak antarmuka kelas dengan menggunakan fitur refactor Visual studio. Minta kelas parsial mengimplementasikan antarmuka itu.
Sekarang Dapatkan objek "Type" dari objek kelas dan dapatkan atribut khusus dari info properti menggunakan getProperties pada objek Type. Ini tidak akan memberikan atribut khusus pada objek kelas karena properti kelas tidak memiliki atribut khusus properti antarmuka yang terpasang / diwariskan.
Sekarang panggil GetInterface (NameOfImplemetedInterfaceByclass) pada objek Type kelas yang diambil di atas. Ini akan memberikan objek "Jenis" antarmuka. kita harus tahu NAMA antarmuka yang diimplementasikan. Dari objek Type dapatkan informasi properti dan jika properti antarmuka memiliki atribut khusus yang dilampirkan maka informasi properti akan memberikan daftar atribut khusus. Kelas pelaksana harus menyediakan implementasi properti antarmuka. Cocokkan nama properti khusus objek kelas dalam daftar informasi properti antarmuka untuk mendapatkan daftar atribut khusus.
Ini akan berhasil.
sumber
Meskipun jawaban saya terlambat dan spesifik untuk kasus tertentu, saya ingin menambahkan beberapa ide. Seperti yang disarankan dalam jawaban lain, Refleksi atau metode lain akan melakukannya.
Dalam kasus saya, properti (stempel waktu) diperlukan di semua model untuk memenuhi persyaratan tertentu (atribut pemeriksaan konkurensi) dalam proyek inti kerangka kerja Entitas. Kita bisa menambahkan [] di atas semua properti kelas (menambahkan antarmuka IModel yang modelnya diterapkan, tidak berfungsi). Tetapi saya menghemat waktu melalui Fluent API yang berguna dalam kasus ini. Dalam fluent API, saya dapat memeriksa nama properti tertentu di semua model dan ditetapkan sebagai IsConcurrencyToken () dalam 1 baris !!
Demikian juga jika Anda memerlukan atribut apa pun untuk ditambahkan ke nama properti yang sama di 100 kelas / model, kita dapat menggunakan metode fluent api untuk inbuilt atau resolver atribut khusus. Meskipun api fasih EF (baik inti dan EF6) dapat menggunakan refleksi di belakang layar, kami dapat menghemat tenaga :)
sumber