【问题标题】:GetProperty("pname") returns nullGetProperty("pname") 返回 null
【发布时间】:2022-01-15 09:01:24
【问题描述】:

我想获取动态对象的动态属性的值。 这是我的代码..

public string ReturnProperty(object ob, string prop)
{            
    Type type = ob.GetType();
    PropertyInfo pr = type.GetProperty(prop);

    //Here pr is null..Dont know whats wrong

    return pr.GetValue(ob, null).ToString();
}

【问题讨论】:

  • obprop 是什么值?
  • 你能详细说明你的代码吗??
  • ob 是动态对象,prop 是动态属性。它们从 db 动态生成。我需要有 dynob.dynprop 的值
  • @incomplete:这不是很具有描述性。一个简短但完整的例子会让它更清楚。
  • 如果有 10 个商家,则 bus.bname 将给出商家的商家名称,bus.bid 将给出商家 id 等等。所以这里的属性名称,即(bname,bid,...)这些是动态的。

标签: c# asp.net


【解决方案1】:

我的猜测是,要么它不是公共属性,要么你的名字弄错了,要么它根本就不是一个属性(而是一个公共字段)。

在不知道实际类型是什么的情况下无法说更多,但这应该是一个开始。

您提到这是一个“动态对象”,但这并不是非常具有描述性。请记住,CLR 本身对 DLR 一无所知 - 如果您的意思是这是一个实现 IDynamicMetaObjectProvider 或扩展 DynamicObject 的类型,那么您将无法获得“正常”的属性像这样的反射。

【讨论】:

  • 我遇到了类似的问题,实际上我根本没有财产,而是公共领域!使用 FieldInfo 而不是 PropertyInfo 对我有用。
【解决方案2】:

试试
Type.GetProperty(String, BindingFlags)
重载并选择正确的绑定标志。

【讨论】:

    【解决方案3】:

    我试过了,效果很好。

    public string ReturnProperty(object ob, string prop)
    {
        Type type = ob.GetType();
        PropertyInfo pr = type.GetProperty(prop);
        //Here pr is null..Dont know whats wrong
        return pr.GetValue(ob, null).ToString();
    }
    
    ReturnProperty(new { abc = 10 }, "abc");
    

    怎么了???

    【讨论】:

    • 你之前是怎么打电话给ReturnProperty(new { abc = 10 }, "abc");的?
    【解决方案4】:

    ExpandoObject 的示例(它实现了提到的 IDynamicMetaObjectProvider Jon Skeet):

        public static string ReturnProperty(object ob, string prop)
        {
            if (ob is ExpandoObject)
            {
                return ((ExpandoObject)ob).Single(e => e.Key == prop).Value.ToString();
            }
            Type type = ob.GetType();
            PropertyInfo pr = type.GetProperty(prop);
            return pr.GetValue(ob, null).ToString();
        }
    
        //--
    
        dynamic dyna = new ExpandoObject();
    
        dyna.Name = "Element";
    
        Console.WriteLine(ReturnProperty(dyna, "Name"));
    

    【讨论】:

      【解决方案5】:

      当我在 MVC 项目中传递排序网格视图的错误数据时,我刚刚遇到了这个问题。

              public HolidaysGridViewModel()
          {
              this.Sort = "HolidayDate"; // this was the wrong name 
              this.SortDir = "ASC";
          }
      

      在阅读了您的问题后,我意识到您很可能是从数据库中传递了企业名称而不是数据库列对象的名称,因此没有找到可能是导致您的问题的结果空值。

      【讨论】:

        【解决方案6】:

        在我的情况下,ob 没有正确地使用pr getter setter

        //causes GetProperty to return null
        public class MyClass{
            public object pr;
        }
        
        //Works
        public class MyClass{
            public object pr { get; set; }
        }
        

        【讨论】:

          【解决方案7】:

          就我而言,我必须定义 get 和 set。见上面的帖子

          public string MyPropertyName { get; set; }
          

          在此之后,我可以通过:

          typeof(MyClassItem).GetProperty("PropertyName")
          

          【讨论】:

            【解决方案8】:

            如果您尝试访问的项目没有 getter 和 setter 访问器,那么它很可能是一个字段。

            所以您的代码将按如下方式工作:

            FieldInfo fieldInfo = type.GetField(fieldName); 
            

            【讨论】:

              猜你喜欢
              • 2018-05-23
              • 1970-01-01
              • 2016-01-21
              • 1970-01-01
              • 2013-11-07
              • 2019-08-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多