2012-03-09 77 views
2

所以如果一個變量的字符串名稱傳入一個方法,我知道使用哪個變量。C#:使用變量時,它的字符串名稱

在以下示例中,我需要幫助的區域是PrintVar(string)...將字符串參數轉換爲變量...以便它打印出「這裏是變量1」和「這裏是變量2」 「分別...謝謝!


class ReflectionTest 
{  
    class MyObj 
    { 
     private string myvar; 

     public MyObj(string input) 
     { this.myvar = input; } 

     public override string ToString() 
     { return ("here be " + myvar); } 
    } 

    class MyClass 
    { 
     private MyObj var1; 
     private MyObj var2; 

     public MyClass() 
     { 
      var1 = new MyObj("variable 1"); 
      var2 = new MyObj("variable 2"); 
     } 

     public void PrintVar(string theVariable) 
     { 
      Console.WriteLine(theVariable); 
     } 
    } 


    static void Main() 
    { 
     MyClass test = new MyClass(); 
     test.PrintVar("var1"); 
     test.PrintVar("var2"); 
    } 
} 
+0

大多數時候,使用集合更容易和更好。 – 2012-03-09 07:06:24

回答

6

如果你需要按名稱去取東西,然後親自我會用字典在內部實現,即

private readonly Dictionary<string,MyObj> fields =new Dictionary<string,MyObj>(); 

public MyClass() 
{ 
    fields["var1"] = new MyObj("variable 1"); 
    fields["var2"] = new MyObj("variable 2"); 
} 
public void PrintVar(string fieldName) 
{ 
    Console.WriteLine(fields[fieldName]); 
} 

將其他選項啓動被反射(GetType().GetFields()):

public void PrintVar(string fieldName) 
{ 
    Console.WriteLine(GetType().GetField(fieldName, 
     BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this)); 
} 
+0

謝謝!我讚賞反射示例和你推薦的字典實現;-) – user1229895 2012-03-09 10:00:32

+0

一個額外的問題... 如果我加... public void WriteOut(){Console.WriteLine(「thank you」); \t} ...'MyObj'類...我如何在PrintVar(string)中調用它? 我想我仍然不確定什麼反射返回... – user1229895 2012-03-09 10:14:59

+1

@ user1229895無論是field [fieldName] .WriteOut();還是((MyObj)GetType()。GetField({與之前一樣})。 GetValue(this))。WriteOut();' – 2012-03-09 10:16:38