Late binding i C#

with No Comments

Traditionellt har Visual Basic haft stöd för både early och late binding. Med early binding (statiskt avsändande) avses användning objekt vars typ är känd redan vid kompilering, medan med late binding (dynamiskt avsändande) avses användning av objekt vars typ inte är känd förrän i runtime. Early binding ger typsäkerhet och även bättre prestanda, men man förlorar en del flexibilitet.

I Visual Basic har man valt att använda Object som dynamisk typ. Det skulle kunna se ut så här:

Objektet av typen SqlConnection har ingen metod som heter DoSomething, men programmet kompilerar och anropet utvärderas när det påträffas, och orsakar då ett MissingMemberException. Typen Object finns även implementerad C#, men används där för att definiera alla typers gemensamma släktskap. Det är inte språkligt tillåtet att använda egenskaper eller anropa funktioner som inte finns deklarerade i variabelns typ. I C# tänker man att objektet som refereras till av en object-referens är boxat, men objektets medlemmar är tillgänglig genom reflection, men då metoden DoSomething inte finns i SqlConnection-instansen kommer GetMethod att ge null.

Sedan version 4 finns språkligt stöd för late binding även i C#, men till skillnad från Visual Basic som använder typen Object har C# fått typen dynamic, som internt är implementerat som ett dictionary. Det innebär att egenskaper och metoder kan anropas på traditionellt sätt, men att anropen utvärderas i runtime. Detta orsakar ett RuntimeBinderException, men kompilatorn släpper igenom koden trots att metoden saknas i objektet:

Late binding är användbart när man interagerar med dynamiska språk som t.ex. JavaScript. Att ta emot ett starkt typat JSON-objekt från en webbtjänst innefattar att skicka en förfrågan, att tolka svaret med en JSON parser och kopiera resultatet till det typade objektet.

Genom typen dynamic kan vi konvertera JSON-koden direkt till ett C#-objekt, vilket kan göras med NuGet-paketet Newtonsoft.Json, enligt följande:

Eftersom svaret är dynamiskt, behöver vi inte längre ha klassen som deklarerar dess typ. Om man vill analysera objektet, går det bra att utnyttja att ett dynamiskt objekt är ett dictionary.

Follow Anders Hesselbom:

Latest posts from

Leave a Reply