@Author, @Rev - nie wszystko stracone na szczęście ;]
Od C# 3.0 mamy całkiem fajny feature jak expression trees. W ten sposób można w sposób kompletnie type-safe napisać:
string GetName<T>(Expression<Func<T>> exp)
{
var body = exp.Body;
if (body.NodeType != ExpressionType.MemberAccess) { throw new ArgumentException(); }
return (body as MemberExpression).Member.Name;
}
Co ciekawe, ten kod faktycznie działa:
class Program
{
string GetName<T>(Expression<Func<T>> exp)
{
var body = exp.Body;
if (body.NodeType != ExpressionType.MemberAccess) { throw new ArgumentException(); }
return (body as MemberExpression).Member.Name;
}
static void Main(string[] args)
{
var prog = new Program();
Console.WriteLine(prog.GetName(() => prog));
}
}
Wypisuje 'prog', bo tak została nazwana zmienna.