如何制作一个扩展函数来获取变量或属性名,如ToString()

本文关键字:变量 属性 ToString 获取 函数 何制作 一个 扩展 | 更新日期: 2023-09-27 18:23:40

是否可以创建一个返回变量名称的函数,如ToString()返回变量的字符串值。

static class myExten
{
    public static string ToName(this object o)
    {
        ///some code that returns the name
    }
}
static void Main()
{
     string country = "India";
     string variableName = country.ToName();
}

非常感谢您的关注。

编辑由于我的问题被标记为重复,我试图解释我的问题是如何不同的

我有一个返回布尔值(下面给出)的通用函数

    static public bool stateNameExists(string name)
    {
        return SQL_Functions.AlreadyExists("**state_name**", table, name);
    }

    public static bool AlreadyExists(string column, string table, string value)
    {
        string qry = "select count(" + column + ") from " + table + " where " + column + " = '"+value+"'";
        string result = execute_scaller(qry);
        try
        {
            if (Convert.ToInt16(result) > 0)
            {
                return true;
            }
        }
        catch
        {
            return false;
        }
        return false;
    }

请注意stateNameExists函数。在这个函数中,我对列名进行硬编码"state_name"

我有一个型号级

class stateModel
{
   public int id [get; set;}
   public string state_name {get; set;}
}

我想使用这样的模型对象传递列的名称SQL_Functions.AlreadyExists(obj.state_name.GetName(),表,名称);

这就是为什么我要求一个扩展函数。

附言:我不能在这里使用c#6.0的技巧。

注意:如果问题仍然重复/已经回答,请提供其链接。非常感谢。

如何制作一个扩展函数来获取变量或属性名,如ToString()

如果我说对了,你需要做这样的事情:

PropertyHelper.GetName<stateModel>(x=>x.state_name)

并在此处接收字符串化的属性名称:"state_name"。

我们使用属性助手类来获取属性名称,您可以尝试以下实现:

public class PropertyHelper
    {
        public static string GetName<T>(Expression<Func<T>> expression)
        {
            return GetName(expression.Body);
        }
        public static string GetName<T>(Expression<Func<T, object>> expression)
        {
            return GetName(expression.Body);
        }
        public static string GetName<T, TProperty>(Expression<Func<T, TProperty>> expression)
        {
            return GetName(expression.Body);
        }
        public static Type GetType<T>(Expression<Func<T, object>> expression)
        {
            return GetMemberExpression(expression.Body).Type;
        }
        public static Type GetType<T, TProperty>(Expression<Func<T, TProperty>> expression)
        {
            return GetMemberExpression(expression.Body).Type;
        }
        private static MemberExpression GetMemberExpression(Expression expression)
        {
            var getMemberExpression = expression as MemberExpression;
            if (getMemberExpression != null)
                return getMemberExpression;
            if (IsConversion(expression))
            {
                var unaryExpression = expression as UnaryExpression;
                if (unaryExpression != null)
                    return GetMemberExpression(unaryExpression.Operand);
            }
            return null;
        }
        private static string GetName(Expression expression)
        {
            return string.Join(".", GetNames(expression));
        }
        private static IEnumerable<string> GetNames(Expression expression)
        {
            var memberExpression = GetMemberExpression(expression);
            if (memberExpression == null)
                yield break;
            foreach (var memberName in GetNames(memberExpression.Expression))
                yield return memberName;
            yield return memberExpression.Member.Name;
        }
        private static bool IsConversion(Expression expression)
        {
            return (expression.NodeType == ExpressionType.Convert
                    || expression.NodeType == ExpressionType.ConvertChecked);
        }
    }

在c#6中,可以使用nameof运算符,但不能在扩展方法中使用

static class myExten
{
    public static string ToName(this object o)
    {
        return nameof(o);
    }
}

这将始终返回"o",即此方法中变量的名称

你能做的最好的事情是这样的:

static void Main()
{
     string country = "India";
     string variableName = nameof(country);
}