我有一个控制台应用程序,我试图动态获取对象属性的值:
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()
方法时似乎发生了错误,但我不明白为什么
答案 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