是否可以创建一个返回变量名称的函数,如.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技巧。
注意:如果问题仍然重复/已经回答,请提供其链接。非常感谢。
答案 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);
}
}