SORU
2 HAZİRAN 2010, ÇARŞAMBA


İ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:

  1. 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 DispatcherUnhandledException ve tüm gerçek bilgi istiyorsan kaybolur. WPF berbatlaşır.

  2. 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 yaramaz RuntimeBinderExceptionler 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
2 HAZİRAN 2010, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kap Slap

    Kap Slap

    8 Mart 2010
  • mipd1980

    mipd1980

    25 EKİM 2006
  • Whizzpopping

    Whizzpopping

    10 Kasım 2005