我经常要导出各种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但是我找不到获取变量实际名称的方法
有人知道如何才能做到这一点吗?
由于
答案 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
的变量名称传递给方法,您可以在那里使用它。