【问题标题】:Accessing a property through reflection returns a different value [closed]通过反射访问属性返回不同的值
【发布时间】:2019-02-11 15:03:28
【问题描述】:

好的,因为我最初的问题似乎有点模棱两可,因为我问的是关于 C# 语言的一般性问题,但是展示了我遇到问题的特定示例的一部分,我将尝试重写以便更清楚地表明我的问题是关于 C# 语言,而不是关于我的特定问题。

我目前有一个类的属性(实际上是几个),根据您是通过代码直接访问它们还是使用反射来返回不同的值。这就是我使用 VS 的即时控制台访问该属性时发生的情况:

> SelectedLine.QtyOutstanding
0

> var prop = SelectedLine.GetType().GetProperty("QtyOutstanding")
> prop.GetValue(SelectedLine)
8

无论属性是如何定义的,在 C# 中,两种访问属性的方式有什么区别? 如果有的话,他们不应该在 setter/getter 中运行完全相同的代码吗?

(考虑到 GetType() 返回的类型与声明的变量相同)

【问题讨论】:

  • QtyOutstanding 是如何定义的?是字段还是属性?
  • @IllusiveBrian 显然是一个属性,因为GetProperty(...).GetValue(...) 返回了一些东西。否则 OP 将获得 NRE。我的猜测是某些线程正在更改属性值。
  • @IllusiveBrian 我添加了一个小例子来说明它是如何定义的。如您所见,它没有什么特别之处:/
  • @HimBromBeere 这是我的第一个想法(某些东西正在改变属性的值)但是,无论我访问该属性多少次,使用反射总是返回正确的值,并访问该属性没有。
  • 请阅读How to Ask 并创建一个minimal reproducible example。发生了一些你没有向我们展示的事情,而且很难准确猜测它是什么。

标签: c# xamarin realm


【解决方案1】:

我找到了制作这个的方法,也许你的情况是这样的?

如果你的 SelectedLine 可以通过接口访问,并且你的类有一个明确的实现,但也有一个同名的公共属性,这可能会导致不同的结果。 示例

class Program
{
    static void Main(string[] args)
    {
        var SelectedLine = (ILine)new Line(8);
        Console.WriteLine(SelectedLine.QtyOutstanding); // 0
        var prop = SelectedLine.GetType().GetProperty("QtyOutstanding");
        Console.WriteLine(prop.GetValue(SelectedLine)); // 8
        Console.ReadLine();
    }
}


class Line : ILine
{
    public Line(int qtyOutstanding)
    {
        QtyOutstanding = qtyOutstanding;
    }

    public int QtyOutstanding { get; }

    int ILine.QtyOutstanding
    {
        get
        {
            return 0;
        }
    }
}

interface ILine
{
    int QtyOutstanding { get; }
}

【讨论】:

  • 不是我的情况,但它确实表明了这是如何可能的,这当然令人惊讶:O
  • 这有点可惜。如果两种方式都调用属性的 getter,您是否对其进行了调试或通过记录验证?
  • 恕我直言,这并不奇怪,因为您明确地实现了接口。这样你就必须使用接口成员,这是通过检索接口类型来完成的:typeof(ILine).GetProperty(...).GetValue(...)。无论如何都是很好的展示。
  • @Malior 您的评论确实敲响了警钟。我的 getter/setter 中没有代码,但是,正如您从我发布的简短代码中看到的那样,我正在使用 Realm,并且我认为 Realm 正在使用 Fody 在编译时向 getter/setter 添加代码。我将对此进行调查,因为至少这是我可以遵循的线索。非常感谢!
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2020-10-30
  • 2018-02-07
相关资源
最近更新 更多