簡體   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