C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.91065 の関連記事表示

<< 0 >>
■91065  自作クラスだとGetPropertyでnullが返ってくる
□投稿者/ NNN -(2019/05/24(Fri) 00:24:29)

    分類:[C#] 

    クラスのメンバーを文字列で指定し、値を取るといった内容を以下サイトを見て試しています
    https://dobon.net/vb/dotnet/programing/typeinvokemember.html

    例えば以下のように標準?のクラスを使用すればPropertyInfoは取得出来るのですが
    Point p = new Point();
    PropertyInfo pi = typeof( t ).GetProperty("X");

    以下のように自作のクラスの場合だとPropertyInfoにnullが返ってきます
    public class PointD {
    double x;
    double y;
    }
    PointD p = new PointD();
    PropertyInfo pi = typeof( t ).GetProperty("x");

    調べても参考サイトでは自作クラスで取得出来ているような気がするのですが自作クラスの場合何か制限があるのでしょうか?

    【実行環境】
    Windows10
    VisualStudio2015
    .NET Frameworks 4.0
親記事 /過去ログ157より / 関連記事表示
削除チェック/

■91066  Re[1]: 自作クラスだとGetPropertyでnullが返ってくる
□投稿者/ 魔界の仮面弁士 -(2019/05/24(Fri) 02:15:36)
    No91065 (NNN さん) に返信
    > 例えば以下のように標準?のクラスを使用すればPropertyInfoは取得出来るのですが
    > Point p = new Point();

    上記が System.Drawing.Point のことだとすれば、
    それは「クラス」ではなく「構造体」ですよ。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.point


    > 以下のように自作のクラスの場合だとPropertyInfoにnullが返ってきます
    > public class PointD {
    >   double x;
    >   double y;
    > }

    この場合の x は、「プロパティ」ではなく「フィールド」だからです。
    GetPropery ではなく、GetField で取得するようにするか、
    もしくは PointD のメンバーをプロパティ宣言に変更しましょう。


    それと、現状の PointD のメンバーにはアクセス修飾子が無いため、
    private 扱いとなっています。
    https://ufcpp.net/study/csharp/oo_conceal.html

    もし、非公開メンバーをリフレクションで取得するのであれば、
    GetField や GetProperty メソッドを呼び出す際に、
    引数に BindingFlags を指定可能なオーバーロードを利用せねばなりません。
記事No.91065 のレス /過去ログ157より / 関連記事表示
削除チェック/

■91067  Re[2]: 自作クラスだとGetPropertyでnullが返ってくる
□投稿者/ NNN -(2019/05/24(Fri) 07:22:49)
    回答ありがとうございます。

    No91066 (魔界の仮面弁士 さん) に返信
    > ■No91065 (NNN さん) に返信
    >>例えば以下のように標準?のクラスを使用すればPropertyInfoは取得出来るのですが
    >>Point p = new Point();
    >
    > 上記が System.Drawing.Point のことだとすれば、
    > それは「クラス」ではなく「構造体」ですよ。
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.point

    失礼しました。自作クラスの方がPointのdouble型だったので類似のものを合わせて書いてしまいました。
    実際動作させているものはSystem.Windows.Forms.TextBoxのText等を取得しようとしています。

    >>以下のように自作のクラスの場合だとPropertyInfoにnullが返ってきます
    >>public class PointD {
    >>  double x;
    >>  double y;
    >>}
    >
    > この場合の x は、「プロパティ」ではなく「フィールド」だからです。
    > GetPropery ではなく、GetField で取得するようにするか、
    > もしくは PointD のメンバーをプロパティ宣言に変更しましょう。

    「メンバー変数」と一括りに考えていて「プロパティ」「フィールド」という区別がなかったのでとても助かります。
    そのあたり踏まえて改めて検索して調べようと思います。
    「プロパティ宣言に変更」というのはget/setを付けるという意味になるのでしょうか?

    > それと、現状の PointD のメンバーにはアクセス修飾子が無いため、
    > private 扱いとなっています。
    > https://ufcpp.net/study/csharp/oo_conceal.html
    >
    > もし、非公開メンバーをリフレクションで取得するのであれば、
    > GetField や GetProperty メソッドを呼び出す際に、
    > 引数に BindingFlags を指定可能なオーバーロードを利用せねばなりません。

    こちらも申し訳ありません。C言語の構造体のように扱っているので正しくは
    public class PointD {
    public double x;
    public double y;
    }
    と記載しております。BindingFlagsを指定していなかったので正確に指定して理解を深めていこうと思います
記事No.91065 のレス /過去ログ157より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -