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));