C#访问字段语法

时间:2009-07-30 23:18:09

标签: c# .net

如果我只拥有我想要访问的变量的名称,我将如何访问对象的变量值?在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
    }
}

3 个答案:

答案 0 :(得分:2)

您可以使用反射按名称访问字段:

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

答案 1 :(得分:1)

获取变量列表中每个变量的唯一方法是对对象进行反射,但是,最终会得到一组object类型的值,无法知道实际包含的内容的类型(即你最终会得到一个类型为object的变量,用于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非常相似。

答案 2 :(得分: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);
        }
    }
}

它可以解决您的问题,但如果我的意见很重要,您应该使用普通属性,因为您会失去类型安全性。