2017-12-02 128 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