Dengan asumsi hierarki pewarisan hipotetis berikut:
public interface IA
{
int ID { get; set; }
}
public interface IB : IA
{
string Name { get; set; }
}
Menggunakan refleksi dan melakukan panggilan berikut:
typeof(IB).GetProperties(BindingFlags.Public | BindingFlags.Instance)
hanya akan menghasilkan properti antarmuka IB
, yaitu " Name
".
Jika kami melakukan tes serupa pada kode berikut,
public abstract class A
{
public int ID { get; set; }
}
public class B : A
{
public string Name { get; set; }
}
panggilan typeof(B).GetProperties(BindingFlags.Public | BindingFlags.Instance)
akan mengembalikan larik PropertyInfo
objek untuk " ID
" dan " Name
".
Apakah ada cara mudah untuk menemukan semua properti dalam hierarki pewarisan untuk antarmuka seperti pada contoh pertama?
c#
.net
reflection
sduplooy
sumber
sumber
Stack<Type>
alih - alih aQueue<>
. Dengan tumpukan, keturunan mempertahankan urutan seperti itu diinterface IFoo : IBar, IBaz
manaIBar : IBubble
dan 'IBaz: IFlubber, the order of reflection becomes:
IBar,
IBubble,
IBaz,
IFlubber,
IFoo`.GetProperties
. Anda gunakanGetInterfaces
pada tipe awal Anda yang akan mengembalikan daftar rata dari semua antarmuka dan cukup lakukanGetProperties
pada setiap antarmuka. Tidak perlu rekursi. Tidak ada pewarisan atau tipe dasar di antarmuka.Type.GetInterfaces
mengembalikan hierarki yang diratakan, jadi tidak perlu penurunan rekursif.Seluruh metode dapat ditulis lebih ringkas menggunakan LINQ:
sumber
GetValue
yang diambilPropertyInfo
, meneruskan instance Anda (yang nilai propertinya akan diambil ) sebagai parameter. Contoh:var list = new[] { 'a', 'b', 'c' }; var count = typeof(IList).GetPublicProperties().First(i => i.Name == "Count").GetValue(list);
← akan menghasilkan 3, meskipunCount
didefinisikan di dalamICollection
, bukanIList
.GetInterfaces
tidak diperlukan jikatype
adalah sebuah kelas, karena kelas konkret HARUS mengimplementasikan semua properti yang ditentukan di semua Antarmuka di rantai pewarisan. MenggunakanGetInterfaces
skenario itu akan mengakibatkan SEMUA properti diduplikasi.Hierarki antarmuka sangat merepotkan - mereka tidak benar-benar "mewarisi" seperti itu, karena Anda dapat memiliki banyak "orang tua" (karena menginginkan istilah yang lebih baik).
"Meratakan" (sekali lagi, bukan istilah yang tepat) hierarki mungkin melibatkan pemeriksaan semua antarmuka yang diimplementasikan antarmuka dan bekerja dari sana ...
sumber
Masalah yang sama persis memiliki solusi yang dijelaskan di sini .
FlattenHierarchy tidak berfungsi btw. (hanya pada vars statis. mengatakan demikian dalam intellisense)
Solusi. Waspadalah terhadap duplikat.
sumber
Menanggapi @douglas dan @ user3524983, pertanyaan OP berikut harus dijawab:
atau, untuk properti individu:
Oke lain kali saya akan men-debugnya sebelum memposting alih-alih setelah :-)
sumber
ini bekerja dengan baik dan singkat bagi saya dalam pengikat model MVC kustom. Harus dapat memperkirakan skenario refleksi apa pun. Masih agak menyebalkan karena itu terlalu berlalu
sumber