Вопрос по Linq, lambda, Expression

yabs

Всем привет.есть функция, которая принимает метод определенного класса.Ее задача достаточно тривиальна - вытащить строковое название переданного метода и класса.
public static string Action<T>(Expression<Func<T, object>> action) { }
вызывается так
Action<BaseController>(x => x.ConvertHtmlToPdf("test"));
задача заключается в том, чтобы заставить принимать функцию метод без параметровкак-то вот так
Action<BaseController>(x => x.ConvertHtmlToPdf);
не могу допетрить, как этого добитьсязаранее спасибо
9 ответов

yabs

yabs, nameof()


yabs

public static string GetCallerName()
 {
 StackFrame frame = new StackFrame(1);
 var method = frame.GetMethod();
 var type = method.DeclaringType;
 var name = method.Name;
 return $"{type}\\{name}";
 }


yabs

yabs, nameof()
не подходитнужна проверка, что переданный метод существует в классе


yabs

yabs,
class Program
{
 public static void Main()
 {
 Console.WriteLine(Action<BaseController>(x => x.ConvertHtmlToPdf));
 }

 public static string Action<T>(Expression<Func<T, Func<string, object>>> action)
 where T : new()
 {
 return action.Compile()(new T())("test") as string ?? "null";
 }
}

class BaseController
{
 public object ConvertHtmlToPdf(string name)
 {
 return string.Concat(name, name);
 }
}
?


yabs

Roman Mejtes,это вообще из другой оперы


yabs

Сон Веры Павловны,спасибо, это почти тотолько Func накладывает ограничения на типы аргументов и возвраещемого типа((


yabs

yabs,тогда можно попробовать как-то так:
class Program
{
 public static void Main()
 {
 Console.WriteLine(Action<BaseController>(x => (Func<string, object>)x.ConvertHtmlToPdf));
 }

 public static void Foo<T>(object wrapper)
 {
 }

 public static string Action<T>(Expression<Func<T, dynamic>> action)
 where T : new()
 {
 var method = ((MethodCallExpression) ((UnaryExpression) action.Body).Operand).Arguments
 .OfType<ConstantExpression>()
 .FirstOrDefault(a => a.Value is MethodInfo);
 return method == null ? "null" : ((MethodInfo) method.Value).Name;
 }
}

class BaseController
{
 public object ConvertHtmlToPdf(string name)
 {
 return string.Concat(name, name);
 }
}


yabs

(Foo там не нужен - случайно затесался)


yabs

Сон Веры Павловны,да, спасибо. похоже на то.громоздко правда ((