Domanda

Sono ascoltando un discorso sulla parola chiave C # 4 di dinamico e mi chiedo ... Questa funzione sarà ortogonale alle altre. Le funzionalità NET, ad esempio, supporteranno i metodi di estensione?

public static class StrExtension {
    public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
x.twice(); // will this work?

Nota: questa domanda è stata posta prima della spedizione di C # 4, motivo per cui è formulata in futuro.

È stato utile?

Soluzione

Da " Nuove funzionalità in C # 4 " word doc :

  

La ricerca dinamica non sarà in grado di farlo   trova metodi di estensione. Se   i metodi di estensione si applicano o no dipende   sul contesto statico della chiamata   (ovvero quali clausole using si verificano), e   questa informazione di contesto non lo è   attualmente mantenuto come parte del payload.

Altri suggerimenti

Questo funziona che trovo interessante almeno ...

public static class StrExtension
{
   public static string twice(this string str) { return str + str; }
}

...
dynamic x = "Yo";
StrExtension.twice(x);

Tuttavia, se il compilatore riesce a trovare il metodo di estensione corretto al momento della compilazione, non vedo perché non può impacchettare un insieme di metodi di estensione da cercare in fase di esecuzione? Sarebbe come una v-table per i metodi non membri.

EDIT:

Questo è bello ... http: //www2.research.att. com / ~ bs / multimethods.pdf

Non può funzionare, i metodi di estensione funzionano a seconda che lo spazio dei nomi sia incluso nel file e, per quanto ne so, MSIL non ha idea dei file e degli spazi dei nomi inclusi.

Puoi creare un metodo di estensione per oggetto e assegnarlo a una dinamica :

public static void MyExt(this object o) {
    dynamic d = o;
    d.myProp = "foo";
}

e chiamalo così:

ClassWithMyProp x;
x.MyExt();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top