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

时间:2015-11-21 10:16:51

标签: c#

是否可以创建一个返回变量名称的函数,如.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();
}

非常感谢你的关注。

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

我有一个泛型函数,它返回一个bool值(如下所示)

    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(),table,name);

这就是我要求扩展功能的原因。

P.S:我不能在这里使用c#6.0技巧。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

并在此处接收字符串的属性名称:&#34; state_name&#34;。

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

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