当前位置:  开发笔记 > 编程语言 > 正文

你如何获得变量的名称,因为它在声明中是物理输入的?

如何解决《你如何获得变量的名称,因为它在声明中是物理输入的?》经验,为你挑选了3个好方法。

也许你需要这个.工作良好.

我在这里找到了这个.

static void Main(string[] args)
{
    var domain = "matrix";
    Check(() => domain);
    Console.ReadLine();
}

static void Check(Expression> expr)
{
    var body = ((MemberExpression)expr.Body);
    Console.WriteLine("Name is: {0}", body.Member.Name);
    Console.WriteLine("Value is: {0}", ((FieldInfo)body.Member)
   .GetValue(((ConstantExpression)body.Expression).Value));
}

输出将是:

Name is: 'domain'
Value is: 'matrix'


Markos.. 37

我知道这是一个老问题,但我试图达到同样的目的,谷歌把我送到了这里.几个小时后,我终于找到了办法.我希望其他人会觉得这很有用.

实际上有更多方法可以实现这一目标:

static void Main(string[] args) 
{
  GetName(new { var1 });
  GetName2(() => var1);
  GetName3(() => var1);
}

static string GetName(T item) where T : class 
{
  return typeof(T).GetProperties()[0].Name;
}

static string GetName2(Expression> expr) 
{
  return ((MemberExpression)expr.Body).Member.Name;
}

static string GetName3(Func expr) 
{
  return expr.Target.GetType().Module.ResolveField(BitConverter.ToInt32(expr.Method.GetMethodBody().GetILAsByteArray(), 2)).Name;
}

第一个是最快的.最后2个比第1个慢约20倍.

http://abdullin.com/journal/2008/12/13/how-to-find-out-variable-or-parameter-name-in-c.html



1> 小智..:

也许你需要这个.工作良好.

我在这里找到了这个.

static void Main(string[] args)
{
    var domain = "matrix";
    Check(() => domain);
    Console.ReadLine();
}

static void Check(Expression> expr)
{
    var body = ((MemberExpression)expr.Body);
    Console.WriteLine("Name is: {0}", body.Member.Name);
    Console.WriteLine("Value is: {0}", ((FieldInfo)body.Member)
   .GetValue(((ConstantExpression)body.Expression).Value));
}

输出将是:

Name is: 'domain'
Value is: 'matrix'



2> Markos..:

我知道这是一个老问题,但我试图达到同样的目的,谷歌把我送到了这里.几个小时后,我终于找到了办法.我希望其他人会觉得这很有用.

实际上有更多方法可以实现这一目标:

static void Main(string[] args) 
{
  GetName(new { var1 });
  GetName2(() => var1);
  GetName3(() => var1);
}

static string GetName(T item) where T : class 
{
  return typeof(T).GetProperties()[0].Name;
}

static string GetName2(Expression> expr) 
{
  return ((MemberExpression)expr.Body).Member.Name;
}

static string GetName3(Func expr) 
{
  return expr.Target.GetType().Module.ResolveField(BitConverter.ToInt32(expr.Method.GetMethodBody().GetILAsByteArray(), 2)).Name;
}

第一个是最快的.最后2个比第1个慢约20倍.

http://abdullin.com/journal/2008/12/13/how-to-find-out-variable-or-parameter-name-in-c.html


非常感谢Markos,你的答案真的很有帮助.
链接坏了

3> Joel Coehoor..:

city在这种情况下是类型的实例string.当您致电时,.GetType()您将返回实际的字符串类型,该类型对您的所有特定城市实例都不了解.

我很难理解为什么你不能在代码中输入"city"作为字符串文字,如果那就是你需要的.如果您分享了您想要使用此值的内容以及在何种情况下您将调用您的DoSomething()函数,这可能会有所帮助.

目前,我最好的猜测是你真正想要做的是反映整个Person班级以获得该班级中的字段列表:

public void DoSomething()
{
    MemberInfo[] members = this.GetType().GetMembers();

    // now you can do whatever you want with each of the members,
    // including checking their .Name properties.
}

好的,根据你的编辑我还有更多的东西给你.

您可以在运行时找到使用属性修饰的字段名称,如下所示:

Type t = typeof(Person);
foreach (MemberInfo member in t.GetMembers()
          .Where(m => 
                m.GetCustomAttributes(typeof(MyCustomAttribute)).Any()  ) )
{
    // "member" is a MemberInfo object for a Peson member that is 
    // decorated with your attribute
}

如果需要,您还可以在第一个GetMembers()调用中使用绑定标志将其限制为仅字段.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有