获取参数对象的名称

时间:2017-12-02 19:53:02

标签: c#

我经常要导出各种List<>从我的代码到外部文件。为了以通用的方式执行它,我想编写一个函数,只接受我的变量的名称,然后根据该类中的字段导出。

我的工作正常,我唯一想知道的是我想要导出的变量的名称。我可以得到班级的类型,但那不是我需要的。我可以得到我把它变成的变量的名称,但这不是我需要的。

下面你会找到我正在使用的代码:

public class testClass
{
   public string firstName {get; set;}
   public string lastName {get; set;}
}    

private void test()
{
   testClass nameOfMyTestClass = new testClass();

   // DATA ADDED TO nameOfMyTestClass
   ...

   exportClass(nameOfMyTestClass);
}

public void exportClass(object selectedClass)
{
   string objectName = selectedClass.name;

   string output = string.Empty;

   // GET THE DATA FROM THE SETTINGS
   PropertyInfo[] properties = selectedClass.GetType().GetProperties();

   foreach (var p in properties)
   {
      output += "[" + p.Name + "] " + p.GetValue(selectedClass) + Environment.NewLine;
   }

   // WRITE THE FILE
   File.WriteAllText(basePath + @"DATA\" + objectName + ".txt", output, Encoding.UTF8);
}

所以我将变量nameOfMyTestClass作为对象传递给方法exportClass,因为我希望能够将它用于多个不同的类。

在该方法中,我想使用我添加的变量的名称作为我的文件的名称:例如nameOfMyTestClass.txt

我可以通过使用GetType()来获取Class本身,或者我可以使用ToString()但是这样可以给我NAMESPACE.Form1 + testClass但是我找不到获取变量实际名称的方法

有人知道如何才能做到这一点吗?

由于

2 个答案:

答案 0 :(得分:4)

您无法通过反射获取变量名称,因为它们不在编译汇编的元数据中。

但是要获取变量的名称,可以使用nameof()运算符(随C#6.0引入)。请注意,您必须为名称添加额外参数:

exportClass(nameOfMyTestClass, nameof(nameOfMyTestClass));

public void exportClass(object selectedClass, string name)
{ /* ... */ }

nameof运算符的优点是,如果使用重构(重命名),传递的名称也会更改,而只是在字符串文字中传递名称。

答案 1 :(得分:3)

这是不可能的,因为变量在编译为IL后没有名称。但是有一个解决方法:

void ExportClass(object obj, string className)
{
    ...
}

var testClass = new TestClass();
ExportClass(testClass, nameof(testClass));

您将带有nameof的变量名称传递给方法,您可以在那里使用它。