Come si può intuire, il problema qui è che una dichiarazione yield return
fa un po 'di riscrittura dietro le scene, simile a come fa un'espressione using
o lambda. Viene effettivamente implementato come un enumeratore, con il codice che chiama yield return
come parte del metodo MoveNext
sull'enumeratore.
Questo è un problema generale di utilizzare Reflection: ti dà runtime informazioni sul codice in esecuzione, che non può abbinare il vostro tempo di compilazione idea di ciò che il codice è stato.
Questo è un modo prolisso per dire che non esiste un modo semplice per ottenere le informazioni desiderate. Se dovessi spostare il yield return
in un metodo separato, qualsiasi codice al di fuori di tale metodo non farebbe parte dello MoveNext
, ma potrebbe non essere possibile ottenere ciò che ti serve. Non stai più ricevendo il nome del metodo che sta eseguendo il yield return
, stai ricevendo il nome di esso è chiamante. Se questo è tutto ciò che interessa, sembra che questo:
public IEnumerable<string> Something
{
get
{
var x = MethodBase.GetCurrentMethod().Name;
return this.DoSomething(x);
}
}
private IEnumerable<string> DoSomething(string x)
{
for (int i = 0; i < 5; i++)
{
yield return x;
}
}
EDIT: mentre dubito che vi aiuterà a breve termine, per la cronaca, questo problema viene risolto anche quando si utilizza C# 5 di nuovi attributi. Dal momento che l'attributo CallerMemberName
viene risolto al momento della compilazione, ea quanto pare prima che l'iteratore è stato riscritto in una classe enumeratore, produce il nome della proprietà:
public IEnumerable<string> Something
{
get
{
var x = this.GetCallerName();
for (int i = 0; i < 5; i++)
{
yield return x;
}
}
}
private string GetCallerName([CallerMemberName] string caller = null)
{
return caller;
}
fonte
2012-03-04 02:43:46
Qual è il caso d'uso? Se capissimo la necessità e il contesto, probabilmente potremmo aiutarti meglio. – jason
cosa stai cercando di ottenere? – Lloyd
@Jason, potrei pensare ad alcuni casi d'uso, uno dei quali sarebbe la registrazione. È una buona domanda – kelloti