c# - 您如何获得在声明中实际输入的变量名称?

标签 c# variables reflection

<分区>

Possible Duplicate:
Finding the Variable Name passed to a Function in C#

下面的类包含字段城市。

我需要动态确定在类声明中键入的字段名称 即我需要从对象 city 的实例中获取字符串“city”。

我试图通过在 DoSomething() 中检查它的类型来做到这一点,但在调试器中检查类型的内容时找不到它。

这可能吗?

public class Person
{
  public string city = "New York";

  public Person()
  {
  }


  public void DoSomething()
  {
    Type t = city.GetType();

    string field_name = t.SomeUnkownFunction();
    //would return the string "city" if it existed!
  }
}

有些人在下面的回答中问我为什么要这样做。 原因如下。

在我的现实世界中,城市上方有一个自定义属性。

[MyCustomAttribute("param1", "param2", etc)]
public string city = "New York";

我在其他代码中需要这个属性。 为了获取属性,我使用了反射。 在反射代码中,我需要输入字符串“city”

MyCustomAttribute attr;
Type t = typeof(Person);

foreach (FieldInfo field in t.GetFields())
{

  if (field.Name == "city")
  {
    //do stuff when we find the field that has the attribute we need
  }

}

现在这不是类型安全的。 如果我在 Person 的字段声明中将变量“city”更改为“workCity”,除非我知道更新字符串,否则此行将失败

if (field.Name == "workCity")
//I have to make this change in another file for this to still work, yuk!
{
}

所以我试图找到一些方法来将字符串传递给此代码而无需实际键入它。

是的,我可以将它声明为 Person 中的字符串常量(或类似的东西),但仍然需要输入两次。

呸!这很难解释!!

谢谢

感谢所有回答这个问题的人*很多*。它让我走上了一条更好地理解 lambda 表达式的新道路。它产生了一个新问题。

最佳答案

也许你需要这个。工作正常。

我找到了这个 here .

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

static void Check<T>(Expression<Func<T>> 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'

关于c# - 您如何获得在声明中实际输入的变量名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/716399/

相关文章:

java - 是否可以在 java 中使用反射创建没有无参数构造函数的类的 'blank' 实例?

c# - 循环 SmtpClient.Send()

c# - 参数化和更新查询

c# - Roslyn - 如何将变量声明语句插入脚本的开头(使用后)?

c++ - 如何解决变量初始化C++的警告

c# - 访问自定义属性中的声明类?

java - Doxygen 注释/属性被忽略

c - 这个变量的值是如何在这个循环之外递增的?

variables - 如何在 JMeter 中获取线程和采样器名称

c# - c#中用于反射的动态类名