2

可以说我有以下课程:

public class Provider
{
    ...
    public sealed class Slice
    {
         public readonly double firstName;
         public readonly double secondName;
         public readonly double thirdName;
         ...
    }
    ...
}

该类用于保存滑动时间序列,包含的 Slice 类是返回值。(Provider.Last 属性返回 Slice 的最新实例)。

我需要通过属性名称获取最新返回的 Slice 类的属性值。

PropertyInfo secondNameProperty = Provider.Last.GetType().GetProperty("secondName");
double secondNameValue = (double)secondNameProperty.GetValue(Provider.Last, null);

GetProperty 返回空值。我怎样才能做到这一点?

4

3 回答 3

9

看看你的Slice课:

public sealed class Slice
{
     public readonly double firstName;
     public readonly double secondName;
     public readonly double thirdName;
     ...
}

那些不是属性。它们是田野。要么使它们成为属性,要么使用它们Type.GetField()。使用属性通常是一个更好的主意,IMO,并不难。例如,如果您只想将它​​们设为公开只读,您可以使用:

public sealed class Slice
{
     public double FirstName { get; private set; }
     public double SecondName { get; private set; }
     public double ThirdName { get; private set; }
     ...
}

或者,您可以直接声明只读字段,然后通过属性公开它们。这比使用自动实现的属性要多一些工作,但它消除了在Slice自身内部设置属性的可能性。

(顺便说一句,你真的有一个firstName类型的字段double吗?奇怪。)

于 2012-06-26T16:10:01.817 回答
0

您可以使用 GetMember() - 成员包括属性、方法、字段、事件等。或者使用 Jon Skeet 的回答。

请注意,如果您使用 GetField() 并稍后将字段更改为属性,则 GetMember() 将继续查找有问题的字段或属性,而无需重构代码,而 GetField() 将返回 null。

http://msdn.microsoft.com/en-us/library/xdtchs6z.aspx

于 2012-06-26T16:13:33.060 回答
0

正如 Jon Skeet 所说,这些不是属性。只读属性看起来像这样

public sealed class Slice
{
    public double FirstName { get; private set }
    public double SecondName  { get; private set }
    public double ThirdName { get; private set }
    ...
}

或者

public sealed class Slice
{
    private double _firstName;
    public double FirstName { get { return _fristName; } }

    private double _secondName;
    public double SecondName { get { return _secondName; } }

    private double _thirdName;
    public double ThirdName { get { return _thirdName; } }

    ...
}
于 2012-06-26T16:18:28.953 回答