Dalam bahasa fungsional (seperti lisp), Anda menggunakan pencocokan pola untuk menentukan apa yang terjadi pada elemen tertentu dalam daftar. Setara dalam C # akan menjadi rantai if ... else jika pernyataan yang memeriksa jenis elemen dan melakukan operasi berdasarkan itu. Tidak perlu dikatakan, pencocokan pola fungsional lebih efisien daripada pengecekan tipe runtime.
Menggunakan polimorfisme akan lebih cocok dengan pencocokan pola. Artinya, memiliki objek daftar cocok dengan antarmuka tertentu dan memanggil fungsi pada antarmuka itu untuk setiap objek. Alternatif lain adalah menyediakan serangkaian metode kelebihan beban yang menggunakan jenis objek tertentu sebagai parameter. Metode default mengambil Objek sebagai parameternya.
public class ListVisitor
{
public void DoSomething(IEnumerable<dynamic> list)
{
foreach(dynamic obj in list)
{
DoSomething(obj);
}
}
public void DoSomething(SomeClass obj)
{
//do something with SomeClass
}
public void DoSomething(AnotherClass obj)
{
//do something with AnotherClass
}
public void DoSomething(Object obj)
{
//do something with everything els
}
}
Pendekatan ini memberikan perkiraan untuk pencocokan pola Lisp. Pola pengunjung (seperti yang diterapkan di sini, adalah contoh yang bagus dari penggunaan untuk daftar heterogen). Contoh lain akan untuk pengiriman pesan di mana, ada pendengar untuk pesan tertentu dalam antrian prioritas dan menggunakan rantai tanggung jawab, pengirim melewati pesan dan penangan pertama yang cocok dengan pesan menanganinya.
Sisi lain memberitahu semua orang yang mendaftar untuk pesan (misalnya pola Agregator Acara yang biasa digunakan untuk kopling longgar ViewModels dalam pola MVVM). Saya menggunakan konstruksi berikut
IDictionary<Type, List<Object>>
Satu-satunya cara untuk menambahkan ke kamus adalah fungsi
Register<T>(Action<T> handler)
(dan objek tersebut sebenarnya adalah WeakReference ke yang diteruskan dalam handler). Jadi di sini saya HARUS menggunakan Daftar <Object> karena pada waktu kompilasi, saya tidak tahu apa tipe yang akan ditutup. Namun pada Runtime saya dapat memastikan bahwa itu adalah Jenis yang merupakan kunci untuk kamus. Ketika saya ingin memecat acara yang saya sebut
Send<T>(T message)
dan sekali lagi saya menyelesaikan daftar. Tidak ada keuntungan menggunakan Daftar <dynamic> karena saya harus tetap menggunakannya. Jadi seperti yang Anda lihat ada manfaat untuk kedua pendekatan. Jika Anda akan secara dinamis mengirimkan objek menggunakan Metode overloading, dinamis adalah cara untuk melakukannya. Jika Anda dipaksa untuk membuang apa pun, mungkin juga menggunakan Object.