【问题标题】:PropertyInfo GetValue() Object does not match target typePropertyInfo GetValue() 对象与目标类型不匹配
【发布时间】:2014-07-10 17:21:41
【问题描述】:

我想读取一个 T 类型的值

  public virtual ActionResult Edit(TEditDTO editedDTO)
    {
        if (!ModelState.IsValid) return View(editedDTO);
        var t = editedDTO.GetType();
        var prop = t.GetProperty("Id") ;
        var Id = prop.GetValue(t); // get exception
     }

但得到

对象与目标类型不匹配

【问题讨论】:

  • Id 属性是如何定义的?

标签: c# types


【解决方案1】:

您应该将TEditDTO 的实例传递给GetValue 方法而不是类型实例。

var Id = prop.GetValue(editedDTO);

【讨论】:

  • 这会产生编译器错误,因为第二个参数是必需的。
  • @flo_badea 不,它没有。否则 OP 的代码甚至不会编译
  • @flo_badea,单个参数仅适用于 .net 4.5,这就是为什么我出于向后兼容性的原因选择了两个参数
  • 像冠军一样工作。感谢您的帮助。
【解决方案2】:

试试这个,

var Id = prop.GetValue(editedDTO, null);

【讨论】:

  • @Mohammadreza,同样的例外?这段代码有什么错误?
【解决方案3】:

PropertyInfo.GetValue 方法接受您要读取其值的类型的实例作为第一个参数。如果使用索引器,您还需要为 GetValue 指定一个额外的数组参数。因为两个参数都是必需的,所以在读取普通属性时需要为第二个参数传递 null。 在您的示例中,您传递的是 Type 实例而不是 TEditDTO 实例。使用下面的代码。

var Id = prop.GetValue(editedDTO, null);

【讨论】:

    【解决方案4】:

    试试这个:

    public virtual ActionResult Edit(TEditDTO editedDTO)
    {
        if (!ModelState.IsValid) return View(editedDTO); 
        PropertyInfo prop = typeof(editedDTO).GetProperty("Id") ;
        Object Id = prop.GetValue(editedDTO); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多