繁体   English   中英

使用反射按名称获取属性值

[英]Get property value by name using reflection

可以说我有以下课程:

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返回null。 我怎样才能做到这一点?

看看你的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类型的firstName字段吗?奇怪。)

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

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

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

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

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

    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM