通过反射访问属性将返回不同的值

时间:2019-02-11 15:03:29

标签: c# xamarin realm

好吧,由于我最初的问题似乎有点模棱两可,因为我在询问有关C#语言的一般问题,但是在显示特定示例的过程中我遇到了问题,因此我将尝试重写因此,很清楚我的问题是关于C#语言的,而不是我的特定问题。

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

> SelectedLine.QtyOutstanding
0

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

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

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

1 个答案:

答案 0 :(得分:1)

我找到了一种产生这种方式的方法,也许您的案子是这样的?

如果通过接口可以访问SelectedLine,并且您的类具有该类的显式实现,但还具有相同名称的public属性,则可能导致不同的结果。 例子

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; }
}