你调用的对象是空的。 C#GetProperty()

时间:2013-12-03 20:14:07

标签: c# reflection

我有一个控制台应用程序,我试图动态获取对象属性的值:

  class Program
  {
    static void Main(string[] args)
    {
      DtoCartaCompromiso test = new DtoCartaCompromiso() { CodProducto = 1,
        DescProducto = "aaa",
        CodProveedor = 2,
        DescProveedor = "bbb",
        FechaExpiracion = DateTime.Now,
        FechaMaxEntrega = DateTime.Now,
        NumLote = "22" };

      var testlist = new List<DtoCartaCompromiso>();
      testlist.Add(test);

      List<Header> columns = new List<Header>() { new Header{Name= "CodProducto"},new Header{Name=  "NumLote"},new Header{Name=  "DescProducto"},new Header{Name=  "CodProveedor"},new Header{Name=  "DescProveedor"},new Header{Name=  "FechaExpiracion"},new Header{Name=  "FechaExpiracion"},new Header{Name=  "FechaMaxEntrega"} };

      foreach (var d in testlist)
      {
        foreach (var col in columns)
        {
            string value = ((d.GetType().GetProperty(col.Name).GetValue(d, null)) ?? "").ToString();
            Console.WriteLine(value);
        }
      }
      Console.Read();    
    }
  }

  public class DtoCartaCompromiso
  {
    public int CodProducto;
    public string NumLote;
    public string DescProducto;
    public int CodProveedor;
    public string DescProveedor;
    public Nullable<DateTime> FechaExpiracion;
    public Nullable<DateTime> FechaMaxEntrega;
  }

  public class Header
  {
      public string Name;
  }

当我到达该行时,我收到错误“对象引用未设置为对象的实例”:

string value = ((d.GetType().GetProperty(col.Name).GetValue(d, null)) ?? "").ToString();

当我进入GetProperty()方法时似乎发生了错误,但我不明白为什么

3 个答案:

答案 0 :(得分:10)

问题是你的课程中没有属性,它们实际上是公共领域。公共财产看起来像

public string PropertyName { get; set; }

但在你的情况下,缺乏吸气剂和制定者。

GetProperty()更改为GetField(),它会起作用。或者创建您的字段属性。就个人而言,我会选择第二种选择,因为使用属性而不是公共字段更好。

答案 1 :(得分:0)

在不了解您的应用程序的情况下进行最佳猜测的是null中的以下子排名结果:

d.GetType().GetProperty(col.Name)

此时,后续的.GetValue()调用将因您报告的错误而失败。

答案 2 :(得分:-1)

您的财产可能不公开。公开或将System.Reflection.BindingFlags.NonPublic传递给您的GetProperty电话。

更多信息:http://msdn.microsoft.com/en-us/library/zy0d4103(v=vs.110).aspx