【问题标题】:“Object does not match target type” error getting property value from generic Type“对象与目标类型不匹配”错误从泛型类型获取属性值
【发布时间】:2014-10-01 08:32:14
【问题描述】:

我正在尝试通过以下方法从泛型类型中获取属性的值,但收到上述错误:

  private static void GetValue<T>(T table)
    {
        Type type = typeof(T);

        PropertyInfo[] props = type.GetProperties().Where(p => p.PropertyType.Name.ToLower() != "column").ToArray();
        PropertyInfo[] colProps = type.GetProperties().Where(p => p.PropertyType.Name.ToLower() == "column").ToArray();

        foreach (PropertyInfo p in props)
            foreach (PropertyInfo cp in colProps)
            {
                if (cp.Name.StartsWith(p.Name))
                {
                    var s = p.GetValue(type, null);                        
                }
            }        
    }

GetValue 想要属性所在的类型对吗?

有人对此有任何见解吗?

谢谢!

【问题讨论】:

  • 混合泛型与反射,坏东西。只需删除&lt;T&gt; 并将参数类型设为object。更少的方式来拍摄你的脚。不确定代码可能做什么,它什么都不做,但使用 dynamic 将成为您的下一个选择。当你有一张“桌子”时,肯定是你真正想要的。

标签: c# reflection properties


【解决方案1】:

不,GetValue 想要一个实例,如果成员是静态的,则为 null。

var s = p.GetValue(table, null); 

【讨论】:

  • @user167908 这个评论完全没有意义——你为什么要创建这样一个类型的实例?
  • slugster 是对的。您已经有一个不需要创建另一个实例的实例。如果你这样做,你只会得到你的属性的默认值......
  • 你是对的,我的错,我一次做 20 件事 :) 我删除了这条消息。谢谢。
【解决方案2】:

p.GetValue(type, null) 想要从中检索值的类型的 instance - 在这种情况下,您可能想要该列,但您没有方便的实例(因为所有您所做的是检索 PropertyInfo 的)。

您仍然可以像您一样选择 PropertyInfo(作为一次性操作),因为它们适用于 type,但您还需要迭代列并使用适当的 PropertyInfo符合您条件的每一列(即列名是“xyz”)。

我会建议一些代码,但您当前的示例相当混乱,因此很难准确说出您要做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2011-10-15
    • 2013-12-22
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多