假设我有以下课程:
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。我怎么能这样做?
答案 0 :(得分: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
字段吗?奇怪。)
答案 1 :(得分:0)
您可以使用GetMember() - 成员包括属性,方法,字段,事件等。 或者使用Jon Skeet的回答。
注意,如果您使用GetField()并稍后将字段更改为属性,GetMember()将继续查找有问题的字段或属性而不重构代码,而GetField()将返回null。
答案 2 :(得分:0)
正如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; } }
...
}