Ci sono numerose ragioni per cui membro riflessione a tempo di compilazione non è ancora stato implementato in C# - ma la maggior parte di loro in sostanza si riducono a opportunity cost - ci sono molte caratteristiche altre lingue e miglioramenti che offrono più benefici a più utenti. C'è anche la considerazione che una sintassi infoof
potrebbe essere complicata, confusa e, in definitiva, meno potente dell'uso della riflessione basata su stringhe. Inoltre, non sarebbe una sostituzione completa per la riflessione poiché in molti casi i metadati manipolati non sono noti al momento della compilazione.
Tuttavia, non tutto è perduto, ci sono una serie di trucchi che è possibile utilizzare per eseguire una riflessione leggermente più sicura che sfrutta le funzionalità del linguaggio C#. Ad esempio, possiamo sfruttare le espressioni lambda e gli alberi di espressione per estrarre informazioni su MemberInfo.Un semplice esempio è:
public static class MethodExt {
static MethodInfo MemberInfo(Action d) {
return d.Method;
}
// other overloads ...
}
che funziona quando si passa in un (non anonima) azione delegato:
MethodInfo mi = MethodExt.MemberInfo(Object.ToString);
Un'implementazione del sopra utilizzando alberi espressione può più robusto e flessibile, ma anche sostanzialmente più complicato. Può essere utilizzato per rappresentare accesso a membri e proprietà, indicizzatori, ecc.
Il problema principale con tutti questi approcci "fantasiosi" è che essi confondono gli sviluppatori che sono abituati a vedere il codice di riflessione tradizionale. Inoltre, non sono in grado di gestire tutti i casi, il che spesso si traduce in una sfortunata combinazione di codice di riflessione tradizionale e codice dell'albero delle espressioni di fantasia. Personalmente, mentre queste tecniche sono interessanti e inventive, è probabilmente meglio evitarle nel codice di produzione.
Potrebbe probabilmente essere implementato facilmente. Anch'io volevo qualcosa di simile. Si noti che sarebbe necessaria una sintassi alternativa per i metodi, poiché possono essere sovraccaricati, quindi specificare il nome da solo non sarebbe sufficiente in quel caso. – cdhowie
È possibile creare qualcosa di simile usando Expression Trees; questo funziona particolarmente bene per proprietà e campi. –
@Bryant hai un esempio o un link? – ja72