【问题标题】:C# Dynamically retrieve value of property [duplicate]C#动态检索属性值[重复]
【发布时间】:2020-05-14 02:24:36
【问题描述】:

我正在尝试在我的应用程序中动态获取属性的数据类型。我有以下代码行使用属性的支持变量的名称来获取类型并且它可以正常工作。

var tobj_Type = this.GetType().GetField("ii_ServerPort", BindingFlags.Public | BindingFlags.Instance).GetValue(this).GetType();

在这行代码中,我尝试使用属性名来尝试获取类型。

var tobj_PropertyType = this.GetType().GetField("ServerPort", BindingFlags.Public | BindingFlags.Instance).GetValue(this).GetType();

失败并出现以下错误: 对象引用未设置为对象的实例。

知道如何在此处使用属性名称而不是支持变量吗?

【问题讨论】:

  • 不是也有BindingFlag.Property吗?
  • @TanveerBadar 没有,但是有一个 GetProperty 方法。
  • @TanveerBadar - 我在任何示例中都没有看到,但确实有。它们是 GetProperty、PutDispProperty、PutRefDispProperty 和 Set 属性。我尝试了 GetProperty 并收到了同样的错误。还有一个 GetProperty 可以用来代替 GetField。我试过也收到了同样的错误。最后,我确实觉得在没有给出确切答案的情况下人们对这个问题投反对票有点粗鲁。 :)
  • “我尝试了 GetProperty 并收到同样的错误。”你能发布这个尝试吗?代码?请同时发布一个代码行,显示您将如何直接访问此变量,甚至可能是具有此属性的类的布局
  • 我为此工作了五个小时。我觉得付出了合理的努力。即使在这里,也没有人能告诉我应该用来实现结果的标志和函数的确切组合。在第一篇文章之后,我尝试仅使用 GetProperty 绑定标志。那没有用,然后我将函数从 GetField 更改为 GetProperty (仍然使用 GetProperty 绑定标志(但这不起作用。Johnathan Barclay 的答案有效。我使用了 this.GetType().GetProperty("ServerPort", BindingFlags.公共 | BindingFlags.Instance).GetValue(this).GetType();

标签: c# reflection types properties


【解决方案1】:

使用GetProperty 方法代替GetField

您对 GetField 的调用返回 null,因为它们不是称为 ServerPort 的 字段,只有一个 属性

【讨论】:

    【解决方案2】:

    可以,但是因为是属性而不是字段,所以需要使用GetProperty

    var tobj_PropertyType = this.GetType().GetProperty("ServerPort").PropertyType;
    

    对于GetPropertyBindingFlags.Public | BindingFlags.Instance 是默认值,不需要明确指定。

    另外,PropertyInfo 有一个PropertyType 属性,因此不需要访问该值。

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2021-01-14
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 2013-06-17
      相关资源
      最近更新 更多