Un sacco di possibilità prima di Microsoft.CSharp.RuntimeBinderExceptions generata quando ha a che fare con le dinamiche

Ho una standard ‘dinamico dizionario’ il tipo di classe in C# –

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);
    }
}

Ora la chiamo io, come segue:

static void Main(string[] args)
{
    dynamic d = new Bucket();
    d.Name = "Orion"; //2 RuntimeBinderExceptions
    Console.WriteLine(d.Name); //2 RuntimeBinderExceptions
}

L’app fa quello che ci si aspetterebbe, ma il debug output simile a questo:

Una prima occasione eccezione di tipo 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' si è verificato in Microsoft.CSharp.dll 
Una prima occasione eccezione di tipo 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' si è verificato in Microsoft.CSharp.dll 
'ScratchConsoleApplication.vshost.exe' (Gestito (v4.0.30319)): Caricato 'Anonimo Ospitato DynamicMethods Assemblea' 
Una prima occasione eccezione di tipo 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' si è verificato in Microsoft.CSharp.dll 
Una prima occasione eccezione di tipo 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' si è verificato in Microsoft.CSharp.dll 

Qualsiasi tenta di accedere a un membro dinamico sembra uscita da un RuntimeBinderException per i registri di debug. Mentre io sono consapevole che la possibilità di eccezioni non sono un problema in sé e per sé, questo non causare alcuni problemi per me:

  1. Mi capita spesso di avere il debugger set di “rompere le eccezioni”, come sto scrivendo WPF applicazioni, e comunque tutte le eccezioni finiscono con l’essere convertito in un DispatcherUnhandledExceptione tutte le informazioni che si desidera è perso. WPF succhia come che.
  2. Non appena mi ha colpito il codice che utilizza dynamicl’output di debug log diventa abbastanza inutile. Utili per tracciare delle linee che mi interessa ottenere di nascosto tra tutte le inutili RuntimeBinderExceptions

C’è un modo per disattivare questa funzione, o è il RuntimeBinder purtroppo, appena costruito?

Grazie, Orion

Questo si verifica quando si utilizza solo il MVC 3 ViewBag in normali circostanze di lavoro. E ‘ fastidioso e sconcertante poiché le eccezioni sono costosi.
Io sono nuovo .net world, sto sviluppando una applicazione web per agenzia di viaggio utilizzando travelport api. API è a base di SAPONE .wsdl & .file xsd. Ho creato le classi proxy utilizzando vs015 strumento integrato. Quando io uso quelle classi proxy, tutto il flusso è fine e l’api dà risposta, ma in vs015 ‘finestra di Output’ I get”, ” Eccezione generata: ‘Microsoft.CSharp.RuntimeBinder.RuntimeBinderException’ in Microsoft.CSharp.dll”, qual è la ragione di questa eccezione & questo è normale vs015 comportamento. Grazie a tutti voi. Anche se questo non è un posto dove postare questo tipo di commento, ho pensato, ho potuto avvicinarsi a voi ragazzi per l’aiuto da qui.Mi DISPIACE.
Hai la stessa domanda che ho fatto 7 anni fa, nel 2010… scorrere verso il basso e guardare i due risposte, fondamentalmente, queste Eccezioni sono comportamenti normali mostrato quando si utilizza qualcosa di costruito utilizzando il dynamic di parola chiave in C#… sembra una cattiva progettazione decisione di una parte del C# di persone a microsoft, ma il modo in cui è
Grazie, un sacco @OrionEdwards

OriginaleL’autore Orion Edwards | 2010-06-02

2 risposte

  1. 25

    Ogni volta che una proprietà di un oggetto dinamico è stato risolto, il runtime cerca di trovare una proprietà che è definito in fase di compilazione. Da DynamicObject doco:

    È anche possibile aggiungere i propri familiari a
    le classi derivate da DynamicObject
    classe. Se la classe definisce
    proprietà e anche l’override del
    TrySetMember metodo, la dinamica
    language runtime (DLR) utilizza prima il
    lingua raccoglitore per cercare una statico
    definizione di un immobile in classe.
    Se tale proprietà non è disponibile, DLR
    chiama il TrySetMember metodo.

    RuntimeBinderException viene generata ogni volta che il runtime è impossibile trovare un definito staticamente la struttura(cioè quello che potrebbe essere un errore del compilatore in 100% staticamente tipizzato mondo). Da Articolo di MSDN

    …RuntimeBinderException rappresenta un
    tentativo di associare, nel senso di una
    solito errore del compilatore…

    È interessante notare che se si utilizza ExpandoObjectè solo una eccezione durante il tentativo di utilizzare la proprietà:

    dynamic bucket = new ExpandoObject();
    bucket.SomeValue = 45;
    int value = bucket.SomeValue; //<-- Exception here

    Forse ExpandoObject potrebbe essere un’alternativa? Se non è adatto avrete bisogno di guardare in attuazione IDynamicMetaObjectProviderche è come ExpandoObject non invio dinamico. Tuttavia, non è molto ben documentato e MSDN si riferisce alla DLR CodePlex per ulteriori info.

    OriginaleL’autore Igor Zevaka

  2. 20

    Questo è stato mi dà fastidio, troppo. Ho aggiunto l’eccezione all’elenco delle eccezioni in modo che io possa deselezionarlo. Basta seguire questi passaggi:

    • Dal menu Debug, selezionare Eccezioni.
    • Fare clic su “Aggiungi…” pulsante in basso a destra.
    • Scegliere “Common Language Runtime Eccezioni” dal menu a discesa Tipo.
    • Tipo “Di Microsoft.CSharp.RuntimeBinder.RuntimeBinderException” come nome.
    • Fare clic su OK.
    • Il tipo di eccezione sarà ora visualizzata nell’elenco. Basta deselezionarla.

    Vorrei che questa impostazione può essere salvato attraverso soluzioni, ma non credo sia possibile, quindi dovrete riapplicare questa impostazione ogni soluzione.

    Per me, questo in realtà non spegnere il registro di debug che mostra l’eccezione. Non fatemi causa il debugger di rompere queste eccezioni, ma non è quello che voglio. Voglio smettere di sputare.
    Io ancora non ottiene. volevi dire basta ignorarlo quando lo vediamo in uscita questa eccezione in visual studio? Ma è normale??
    Avevo bisogno di spegnere l’interruzione di questa eccezione, e questo lo ha aiutato. Grazie!
    In Visual Studio 2015: menu di Debug ->- > impostazioni delle Eccezioni (Ctrl+Alt+T)

    OriginaleL’autore Anthony Johnston

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *