寻找一种干净的方法来以类型安全的方式发现方法的字符串名称.
这是我对属性的看法,但是我无法弄清楚如何为方法做到这一点.
class Program
{
class Customer
{
public String Id { get; set; }
}
public static String GetPropertyName<T>(
Expression<Func<T, Object>> selector) where T : class
{
var expression = (MemberExpression)selector.Body;
return expression.Member.Name;
}
static void Main(string[] args)
{
String propertyName = GetPropertyName<Customer>(c => c.Id);
}
}
Run Code Online (Sandbox Code Playgroud)
几乎改为:
var expression = (MethodCallExpression)selector.Body;
return expression.Method.Name;
Run Code Online (Sandbox Code Playgroud)
除了明显的例外,您将需要一个Action<T>处理void方法的选项.当然,你必须提供虚拟参数值 - 如果你真的想要你也可以获得它们.
实际上,您现有的代码可能不健全; 你可能需要抛弃一个强制转换操作(将int装入一个对象).
public static string GetMethodName<T>(Expression<Func<T, Object>> selector) where T : class
{
var expression = (MethodCallExpression)(selector.Body is UnaryExpression ? ((UnaryExpression)selector.Body).Operand : selector.Body);
return expression.Method.Name;
}
public static string GetMethodName<T>(Expression<Action<T>> selector) where T : class
{
var expression = (MethodCallExpression)(selector.Body is UnaryExpression ? ((UnaryExpression)selector.Body).Operand : selector.Body);
return expression.Method.Name;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |