2017-12-02 7 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); 
} 

は、だから私は、メソッドのexportClassにオブジェクトとして変数nameOfMyTestClassを渡していますクラス。

このメソッドの中で、私がファイルの名前として追加した変数の名前を使用したいと思います。 nameOfMyTestClass.txt

GetType()を使用してクラス自体を取得することも、ToString()を使用することもできますが、結果としてNAMESPACE.Form1 + testClassが返されますが、実際の変数の名前。

どのように私はこれを達成することができるアイデアはありますか?

おかげ

+1

オブジェクトには名前がありません。そのオブジェクトへの参照を保持するメソッドのすぐ外側のローカル変数の名前は、そのオブジェクトに決して知られていません。名前を渡す必要があります。周りには道がありません。 –

+1

私は@LasseVågsætherカールセンと完全に同意します。最もクリーンな解決策は、ラッパーまたはオブジェクトを持つか、オブジェクトに名前を付けることです。ロリスの答えも可能ですが。 – 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

関連する問題