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

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

C# と VB.NET の入門サイト

自作クラスだとGetPropertyでnullが返ってくる

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■91065 / inTopicNo.1)  自作クラスだとGetPropertyでnullが返ってくる
  
□投稿者/ NNN (1回)-(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
引用返信 編集キー/
■91066 / inTopicNo.2)  Re[1]: 自作クラスだとGetPropertyでnullが返ってくる
□投稿者/ 魔界の仮面弁士 (2184回)-(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 を指定可能なオーバーロードを利用せねばなりません。
引用返信 編集キー/
■91067 / inTopicNo.3)  Re[2]: 自作クラスだとGetPropertyでnullが返ってくる
□投稿者/ NNN (2回)-(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を指定していなかったので正確に指定して理解を深めていこうと思います

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ