2

次のクラスがあるとしましょう。

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

このクラスはスライディング時系列を保持するために使用され、含まれているSliceクラスが戻り値です。(Provider.Lastプロパティは、スライスの最新のインスタンスを返します)。

その最後に返されたSliceクラスのプロパティの値を、プロパティの名前で取得する必要があります。

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

GetPropertyはnullを返します。これどうやってするの?

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()を使用できます-メンバーには、プロパティ、メソッド、フィールド、イベントなどが含まれます。または、JonSkeetの回答を使用してください。

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 に答える