İlk fırsatta bir sürü Microsoft.Bulunan.Dynamics ile ilgili atılan RuntimeBinderExceptions
Bir standart var 'dinamik sözlük C' tipi ders# -
class Bucket : DynamicObject
{
readonly Dictionary<string, object> m_dict = new Dictionary<string, object>();
public override bool TrySetMember(SetMemberBinder binder, object value)
{
m_dict[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return m_dict.TryGetValue(binder.Name, out result);
}
}
Şimdi aşağıdaki gibi derim
static void Main(string[] args)
{
dynamic d = new Bucket();
d.Name = "Orion"; // 2 RuntimeBinderExceptions
Console.WriteLine(d.Name); // 2 RuntimeBinderExceptions
}
Uygulama beklediğin şeyi yapar, ama hata ayıklama çıkış bu gibi görünüyor:
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll 'ScratchConsoleApplication.vshost.exe' (Managed (v4.0.30319)): Loaded 'Anonymously Hosted DynamicMethods Assembly' A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
Herhangi birdinamik bir üyesi erişmeye hata ayıklama için RuntimeBinderException günlükleri bir çıkış gibi görünüyor. İlk şansını özel durumlar ve kendilerinde bir sorun olmadığını farkındayım, ancak bu benim için bazı sorunlara yol açmaktadır:
Bazen ben bile hata ayıklayıcı ayarlamak için "Ara durumlar" olarak yazıyorum WPF uygulamaları ve aksi tüm durumlar sonunda elde dönüştürülmüş bir
DispatcherUnhandledExceptionve tüm gerçek bilgi istiyorsan kaybolur. WPF berbatlaşır.Kullanıyor herhangi bir kod bulur bulmaz
dynamic, çıkış hata ayıklama günlüğü oldukça işe yaramaz hale gelir. Değer verdiğim tüm yararlı izleme hatları tüm işe yaramazRuntimeBinderExceptionler arasında gizli
Bu kapatın veya RuntimeBinder ne yazık ki sadece yerleşik gibi herhangi bir yolu var mı?
Teşekkürler, Orion
CEVAP
Dinamik bir nesne üzerinde bir özellik çözüldüğünde, çalışma zamanı derleme zamanında tanımlanmış bir özellik bulmaya çalışır. DynamicObject doco:
Ayrıca, kendi üyeleri için ekleyebilirsiniz sınıfları DynamicObject türetilmiştir sınıf. Eğer sınıf tanımlar özellikleri geçersiz kılar ve bu da TrySetMember yöntemi, dinamik dil çalışma zamanı (METRO) ilk kullanan bak dil bağlayıcı bir statik için sınıfta bir özellik tanımı. Eğer böyle bir özellik yok, başlık düzenlendi aramalar TrySetMember yöntemi.
RuntimeBinderException zamanı bir statik olarak tanımlı özellik(yani ne statik olarak yazılan 0 derleyici bir hata olurdu dünya) bulmak zaman atılır. MSDN article
...RuntimeBinderException temsil eder bir anlamda bağlamak için bir hata her zamanki derleyici hata...
Eğer ExpandoObject, kullanırsanız sadece bu özelliği kullanmak için çalışırken bir istisna olsun ilginçtir:
dynamic bucket = new ExpandoObject();
bucket.SomeValue = 45;
int value = bucket.SomeValue; //<-- Exception here
Belki de ExpandoObject alternatif olabilir mi? Eğer uygun değilse ExpandoObject dinamik gönderme nasıl IDynamicMetaObjectProvider, uygulama içine bakmak gerekir. Ancak, çok iyi belgelenmiş değildir ve MSDN daha fazla bilgi için, METRO ve Diğer anlamına gelir.

Hemen penceresinde dinamik 'Micro...
Silverlight 4: Çözmek, Microsoft.Silve...
Liste görünümü öğesi kaydırma animasyo...
Microsoft Boolean veri türü SQL MySQL ...
Nasıl uygulamak Microsoft SQL Server i...