2012-03-09 76 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