【问题标题】:Get property value by name using reflection使用反射按名称获取属性值
【发布时间】:2012-06-26 16:07:38
【问题描述】:

假设我有以下课程:

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。我该怎么做?

【问题讨论】:

    标签: c# .net system.reflection


    【解决方案1】:

    看看你的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 本身内设置属性的可能性。

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

    【讨论】:

    • 然后也将它们命名为属性:FirstName
    【解决方案2】:

    正如 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; } }
    
        ...
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多