Perbedaan penting perlu dibuat di sini.
Sebagian besar jawaban di sini khusus untuk ExpandoObject yang disebutkan dalam pertanyaan. Tetapi penggunaan umum (dan alasan untuk mendarat pada pertanyaan ini saat mencari) adalah ketika menggunakan ASP.Net MVC ViewBag. Itu adalah implementasi kustom / subkelas DynamicObject, yang tidak akan membuang Pengecualian ketika Anda memeriksa sembarang nama properti arbitrer untuk null. Misalkan Anda dapat mendeklarasikan properti seperti:
@{
ViewBag.EnableThinger = true;
}
Lalu anggaplah Anda ingin memeriksa nilainya, dan apakah itu disetel - apakah ada. Berikut ini adalah valid, akan dikompilasi, tidak akan memberikan pengecualian, dan memberi Anda jawaban yang benar:
if (ViewBag.EnableThinger != null && ViewBag.EnableThinger)
{
// Do some stuff when EnableThinger is true
}
Sekarang singkirkan deklarasi EnableThinger. Kode yang sama mengkompilasi dan berjalan dengan benar. Tidak perlu refleksi.
Tidak seperti ViewBag, ExpandoObject akan melempar jika Anda memeriksa nol pada properti yang tidak ada. Untuk mendapatkan fungsionalitas MVC ViewBag yang lebih lembut dari dynamic
objek Anda, Anda harus menggunakan implementasi dinamis yang tidak melempar.
Anda bisa menggunakan implementasi yang tepat di MVC ViewBag:
. . .
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = ViewData[binder.Name];
// since ViewDataDictionary always returns a result even if the key does not exist, always return true
return true;
}
. . .
https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DynamicViewDataDictionary.cs
Anda dapat melihatnya diikat ke Tampilan MVC di sini, di MVC ViewPage:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/ViewPage.cs
Kunci perilaku anggun DynamicViewDatationary adalah implementasi Kamus di ViewDataDictionary, di sini:
public object this[string key]
{
get
{
object value;
_innerDictionary.TryGetValue(key, out value);
return value;
}
set { _innerDictionary[key] = value; }
}
https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/ViewDataDictionary.cs
Dengan kata lain, itu selalu mengembalikan nilai untuk semua kunci, terlepas dari apa yang ada di dalamnya - itu hanya mengembalikan nol ketika tidak ada di sana. Tapi, ViewDataDictionary memiliki beban terikat dengan Model MVC, jadi lebih baik untuk menghapus hanya bagian kamus yang anggun untuk digunakan di luar Tampilan MVC.
Terlalu lama untuk benar-benar memposting semua nyali di sini - sebagian besar hanya menerapkan IDictionary - tapi di sini ada objek dinamis (kelas DDict
) yang tidak membuang pemeriksaan nol pada properti yang belum dideklarasikan, di Github:
https://github.com/b9chris/GracefulDynamicDictionary
Jika Anda hanya ingin menambahkannya ke proyek Anda melalui NuGet, namanya GracefulDynamicDictionary .
data.myProperty
; memeriksa apa yangtypeof data.myProperty
kembali. Benar bahwadata.myProperty
mungkin ada dan diaturundefined
, tetapi dalam kasus itu,typeof
akan mengembalikan sesuatu selain"undefined"
. Jadi kode ini berfungsi.