在不知道名字的情况下获取对象的属性值?

时间:2010-12-23 11:30:24

标签: c#

class A
{
    public string a { get; set; } 
    --and so on--   //lets we have 30-50 class variables//
}

我知道它很糟糕。但是我怎么能通过循环而不知道他们的名字只是通过对象或类的实例获得所有变量的值?

for(int i;i<30;i++)
{
    variable[i] = object.? ;
}

2 个答案:

答案 0 :(得分:6)

使用反射。

typeof(A).GetFields()
typeof(A).GetProperties()

答案 1 :(得分:0)

在您的示例中,您有一个字段而不是属性。下面显示了如何遍历类型的所有成员的示例。您可以使用FindMembers而不是GetMemebrs

进行过滤
public class Reflector
{
    public void ShowMembers(object o)
    {
        Type type = o.GetType();
        foreach (MemberInfo member in type.GetMembers())
        {
            Console.WriteLine("{0} is a {1}", member.Name, member.MemberType);
        }
    }
}

对一个按钮运行上面的代码,你会得到类似的东西:

...skip...
ManipulationDelta is a Event
ManipulationInertiaStarting is a Event
ManipulationBoundaryFeedback is a Event
ManipulationCompleted is a Event
IsDefaultProperty is a Field
IsCancelProperty is a Field
IsDefaultedProperty is a Field
...

所以要明确:

Public string a;

是一个字段,而

public string a { get; set; } 

将是一个财产。

我实际上没有回答这个问题。这对我来说很聪明。

public class Reflector
{
    public void ShowMembers(object o)
    {
        Type type = o.GetType();
        foreach (MemberInfo member in type.GetMembers())
        {
            Console.WriteLine("{0} is a {1}", member.Name, member.MemberType);
        }
    }

    public void Set(object o, string fieldName, int val)
    {
        MemberInfo[] info = o.GetType().GetMember(fieldName);
        FieldInfo field = info[0] as FieldInfo;
        field.SetValue(o, val);
    }

    public int x;
}

如果我调用reflector.Set(reflector, "x", 10);所以我自己调用Set,上面的方法会将值设置为10.如果要读取值,则为GetValue。