2017-12-02 130 views
2

我经常必须从我的代码中将各种列表<>导出到外部文件。为了以通用的方式来完成它,我想写一个函数,它只是取得我变量的名称,然后根据该类中的字段进行导出。获取参数对象的名称

我工作得很好,我唯一无法弄清楚的是我想要导出的变量的名称。我可以获得班级的类型,但这不是我需要的。我可以得到我放入的变量的名称,但那不是我所需要的。

下面你会发现我正在使用的代码:

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()获得类本身,或者我可以使用ToString(),但是这给了我NAMESPACE.Form1 + testClass作为结果,但我无法找到一种方法来获得实际变量的名称。

有没有人有一个想法,我可以做到这一点?

感谢

+1

对象没有名称。在保存对该对象的引用的方法之外的局部变量的名称决不会被该对象知道。你也需要传递这个名字,这是没有办法的。 –

+1

我完全同意@LasseVågsætherKarlsen。最干净的解决方案是有一个包装或对象,或使您的对象是可命名的。虽然洛里斯的答案也是可能的。 – Christian

回答

4

你不能得到通过反射的变量名,因为它们不存在在编译的程序集的元数据。

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

exportClass(nameOfMyTestClass, nameof(nameOfMyTestClass)); 

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

nameof运营商的好处是,如果你使用重构(重命名),传递的名称也将被改变,这一比例仅为在字符串文字中传递名称。

+0

感谢阿德里安您的快速回复。 – Cainnech

+0

@Cainnech请注意,只要您通过适当的参数 - 'exportClass(new {nameOfMyTestClass});' –

3

这是不可能的,因为变量在编译为IL后没有名称。但有一种变通方法给你:

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

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

您与nameof传递变量名称的方法,你可以在那里使用它。

+0

我同意..我的答案只适用于属性而不是变量我将删除我的答案 – MethodMan