C# 我们是否可以修改此代码以返回方法的名称而不是属性?
正在寻找一种干净的方法,以类型安全的方式发现方法的字符串名称 这是我对属性的定义,但是我很难弄清楚如何对方法进行定义C# 我们是否可以修改此代码以返回方法的名称而不是属性?,c#,C#,正在寻找一种干净的方法,以类型安全的方式发现方法的字符串名称 这是我对属性的定义,但是我很难弄清楚如何对方法进行定义 class Program { class Customer { public String Id { get; set; } } public static String GetPropertyName<T>( Expression<Func<T, Object>> selec
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);
}
}
类程序
{
类客户
{
公共字符串Id{get;set;}
}
公共静态字符串GetPropertyName(
表达式选择器),其中T:class
{
var expression=(MemberExpression)selector.Body;
返回表达式.Member.Name;
}
静态void Main(字符串[]参数)
{
字符串propertyName=GetPropertyName(c=>c.Id);
}
}
更改为:
var expression = (MethodCallExpression)selector.Body;
return expression.Method.Name;
值得注意的例外是,您需要一个操作
选项来处理无效
方法。当然,您必须提供虚拟参数值——如果您真的需要,您也可以获得这些值
实际上,您现有的代码可能并不健壮;您可能需要放弃强制转换操作(将int框到对象)
公共静态字符串GetMethodName(表达式选择器),其中T:class
{
变量表达式=(MethodCallExpression)(selector.Body是UnaryExpression?((UnaryExpression)selector.Body)。操作数:selector.Body);
返回表达式.Method.Name;
}
公共静态字符串GetMethodName(表达式选择器),其中T:class
{
变量表达式=(MethodCallExpression)(selector.Body是UnaryExpression?((UnaryExpression)selector.Body)。操作数:selector.Body);
返回表达式.Method.Name;
}
如果有帮助,我们的代码库将使用以下内容:
public class TypeHelper
{
private static PropertyInfo GetPropertyInternal(LambdaExpression p)
{
MemberExpression memberExpression;
if (p.Body is UnaryExpression)
{
UnaryExpression ue = (UnaryExpression)p.Body;
memberExpression = (MemberExpression)ue.Operand;
}
else
{
memberExpression = (MemberExpression)p.Body;
}
return (PropertyInfo)(memberExpression).Member;
}
public static string GetPropertyName<TObject>(Expression<Func<TObject, object>> p)
{
return GetPropertyNameInternal(p);
}
public static string GetPropertyName<TObject, T>(Expression<Func<TObject, T>> p)
{
return GetPropertyNameInternal(p);
}
public static string GetPropertyName<T>(Expression<Func<T>> p)
{
return GetPropertyNameInternal(p);
}
public static string GetPropertyName(Expression p)
{
return GetPropertyNameInternal((LambdaExpression) p);
}
private static string GetPropertyNameInternal(LambdaExpression p)
{
return GetPropertyInternal(p).Name;
}
public static PropertyInfo GetProperty<TObject>(Expression<Func<TObject, object>> p)
{
return GetPropertyInternal(p);
}
public static PropertyInfo GetProperty<TObject, T>(Expression<Func<TObject, T>> p)
{
return GetPropertyInternal(p);
}
public static PropertyInfo GetProperty<T>(Expression<Func<T>> p)
{
return GetPropertyInternal(p);
}
}
如果您碰巧有
System.Web.Mvc
,则可以使用ExpressionHelper.GetExpressionText(expression)
,如下所示:
Expression<Func<Response, string>> expression = r => r.Message;
Assert.AreEqual("Message", ExpressionHelper.GetExpressionText(expression));
Expression=r=>r.消息;
AreEqual(“Message”,ExpressionHelper.GetExpressionText(expression));
(
Response
是一个带有消息属性的自定义类。)很有趣。示例用法是什么样的GetMethodName(f=>f.Method)
或GetMethodName(f=>f.Method(valid,args))
还是其他什么?
var propertyName = TypeHelper.GetPropertyName<Customer>(c => c.Id);
var propertyName = TypeHelper.GetPropertyName(() => this.Id); // If inside Customer class
Expression<Func<Response, string>> expression = r => r.Message;
Assert.AreEqual("Message", ExpressionHelper.GetExpressionText(expression));