In C# macht man so etwas mit Expression trees, da sie refactoring-safe sind.
Eine naive Implementierung frei Schnauze:
Code:
public static string GetName<TResult>(Expression<Func<TResult>> expression)
{
var me = expression.Body as MemeberExpressin;
if(me != null)
return me.Member.Name;
var mce = expression.Body as MetodCallExpressin;
if(mce != null)
return mce.Method.Name;
throw ....
}
var methodName = Xyz.GetName(() => "".Substring(0, 1)); // ergibt "Substring"
Auf die Art kann man sich auch direkt PropertyInfos oder MethodInfos (vor allem den korrekten Overload) geben lassen. Sollte man aber möglichst so machen, dass es nicht unnötig oft passiert. Type-safe ist nett, aber schnell ist auch wichtig.