属性信息 GetValue() 的对象与目标类型不匹配。

13

我想要读取 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 属性是如何定义的? - Richard
4个回答

34

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

var Id = prop.GetValue(editedDTO);

由于第二个参数是必需的,因此这会生成编译器错误。 - flo_badea
2
@flo_badea 不,它不会。否则,原始代码甚至无法编译。 - Selman Genç
@flo_badea,单个参数仅适用于 .net 4.5,这就是为什么我选择了两个参数以实现向后兼容性的原因。 - Yuliam Chandra
运行得非常好。感谢您的帮助。 - Andy Evans

4

请试一试,

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

1
@Mohammadreza,同样的异常?这段代码有什么错误? - Yuliam Chandra

4

PropertyInfo.GetValue方法的第一个参数接受要读取值的类型的实例。如果使用索引器,则还需要指定额外的数组参数才能获取值。由于这两个参数都是必需的,所以在读取普通属性时需要将第二个参数设置为null。 在您的示例中,您传递了一个Type实例而不是TEditDTO实例。请使用以下代码:

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

3

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接