System.Reflection GetProperties方法不返回值

时间:2011-10-20 15:19:09

标签: c# .net reflection

有人可以向我解释为什么如果类设置如下,GetProperties方法不会返回公共值。

public class DocumentA
{
    public string AgencyNumber = string.Empty;
    public bool Description;
    public bool Establishment;
}

我正在尝试设置一个简单的单元测试方法来使用

该方法如下,它具有所有适当的使用陈述和参考。

我正在做的就是调用以下内容但它返回0

PropertyInfo[] pi = target.GetProperties(BindingFlags.Public | BindingFlags.Instance);

但是,如果我使用私有成员和公共属性设置类,它可以正常工作。

我没有按照旧学校方式设置课程的原因是因为它有61个属性并且这样做会使我的代码行增加至少三倍。我会成为维护的噩梦。

4 个答案:

答案 0 :(得分:48)

您尚未声明任何属性 - 您已声明字段。以下是与属性类似的代码:

public class DocumentA
{
    public string AgencyNumber { get; set; }
    public bool Description { get; set; }
    public bool Establishment { get; set; }

    public DocumentA() 
    {
        AgencyNumber = "";
    }
}

我强烈建议您使用上述属性(或者可能使用更受限制的setter),而不是仅仅使用Type.GetFields。公共字段违反封装。 (公共可变属性在封装前端并不是很好,但至少它们提供了一个API,其实现可以在以后更改。)

答案 1 :(得分:4)

因为您现在宣布您的课程的方式是使用Fields。如果要通过反射访问字段,则应使用Type.GetFields()(请参阅Types.GetFields方法1

我现在不使用您正在使用的C#版本,但C#2中的属性语法已更改为以下内容:

public class Foo
{
  public string MyField;
  public string MyProperty {get;set;}
}

这对减少代码量有帮助吗?

答案 2 :(得分:1)

我看到这个帖子已经有四年了,但是我对提供的答案并不满意。 OP应注意OP指的是Fields而不是Properties。要动态重置所有字段(扩展证明),请尝试:

/**
 * method to iterate through Vehicle class fields (dynamic..)
 * resets each field to null
 **/
public void reset(){
    try{
        Type myType = this.GetType(); //get the type handle of a specified class
        FieldInfo[] myfield = myType.GetFields(); //get the fields of the specified class
        for (int pointer = 0; pointer < myfield.Length ; pointer++){
            myfield[pointer].SetValue(this, null); //takes field from this instance and fills it with null
        }
    }
    catch(Exception e){
        Debug.Log (e.Message); //prints error message to terminal
    }
}

请注意,出于显而易见的原因,GetFields()只能访问公共字段。

答案 3 :(得分:0)

如前所述,这些字段不是属性。属性语法为:

public class DocumentA  { 
    public string AgencyNumber { get; set; }
    public bool Description { get; set; }
    public bool Establishment { get; set;}
}