2010-12-23 78 views
0
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.? ; 
} 
+0

可以举一些例子吗? – user426306 2010-12-23 11:42:41

+0

好的我已经纠正了 – user426306 2010-12-23 11:48:07

回答

6

使用反射。

typeof(A).GetFields() 
typeof(A).GetProperties() 
+0

请记住,虽然这个反射是一个性能杀手...我尝试了一个OR/M一次来做一些自动映射 – Ozzy 2010-12-23 11:36:27

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; 

是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);所以我打电话集本身,上述方法如果你想读它的GetValue值的值设置为10。

相关问题