C#访问字段语法

C#访问字段语法,c#,.net,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#中

假设我有一个数组中用字符串表示的变量名列表。 例如,如何在循环中访问它们。 我可以在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
    }
}

获取变量列表中每个变量的唯一方法是对对象进行反射,但是,最终会得到一组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!"
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);
        }
    }
}

请注意,Console.WriteLine的用法与在C及其类似语言中使用printf/fprintf几乎相同。

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

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

如果我正确理解了你的问题,你可以这样做:

Person p = new Person ("John", 25, 160); // Name, age, weight (lbs)
Console.WriteLine ("Hello {0}!", p.Name); // Output: "Hello John!"
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);
        }
    }
}

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

您的代码没有循环,或者使用您声明的数组?是的,你是对的,我的意思是你的问题毫无意义。你甚至没有使用变量名称数组为什么这个线程为C#标记/命名?@Chin:我建议你尽快回来澄清这个问题,否则你回来后可能会发现它关闭了。+1用于解决问题,-1用于实现sad API(当然不是你的错),净投票数为0。