2009-07-30 75 views
-5

如果我只有我希望訪問的變量的名稱,我將如何訪問對象的變量的值?在C#中。C#訪問字段語法

說我有一個變量名稱表示爲一個數組中的字符串。例如,我將如何在循環中訪問它們。 我可以這樣做ActionScript中的以下內容:然而

var arrayOfVariableNames:Array = ["name", "age", "sex"] 

for each(var person:Person in persons) 
{ 
    if (person[age] > 29) //what is equivalent in c# for object[field] 
    { 
     //do something 
    } 
} 
+0

你可以在Java中做到這一點嗎?!? – Jimmy 2009-07-30 23:20:02

+0

你的代碼沒有循環,或者使用你聲明的數組?你想問什麼很不清楚。 – 2009-07-30 23:21:51

回答

2

您可以使用反射通過其名稱訪問一個字段:

FieldInfo ageField = typeof(Person).GetField("age"); 
int age = (int) field.GetValue(person); 
1

讓每一個變量的變量列表的唯一方法是在物體反射,你最終會得到一組類型的對象的值,無法知道實際包含的類型(即,您最終會得到Name [string],Age [int]和Weight [int])類型對象的變量。這使得反射成爲從對象中獲取一組值的一種不好的方式。

但是,一般的語法來訪問一個字段是object.value,就像這樣:

Person p = new Person ("John", 25, 160); // Name, age, weight (lbs) 
Console.WriteLine ("Hello {0}!", p.Name); // Output: "Hello John!" 

需要注意的是個Console.WriteLine這種用法是幾乎相同,C和用printf/fprintf中的之流。

1

如果我理解正確你的問題,你可以做這樣的事情:

class Person { 
    private int age; 
    private string name; 
    private string sex; 

    public object this[string name] 
    { 
     get 
     { 
     PropertyInfo property = GetType().GetField(name); 
     return property.GetValue(this, null); 
     } 
     set 
     { 
     PropertyInfo property = GetType().GetField(name); 
     property.SetValue(this, value, null); 
     } 
    } 
} 

這將解決您的問題,但如果我的意見很重要,你應該使用普通的屬性來代替,因爲你會失去類型安全。