質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

3375閲覧

System.Reflection.MemberInfoをmyclassにキャストしたい

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/09/20 09:31

こんにちは。
Windows10でWPFのアプリケーションを開発しています。
Visual Studio 2017 proを使っています。

###前提・実現したいこと
System.Reflection.MemberInfoで取得したPropertyをあとで呼ぶためにListにしたい。

###発生している問題・エラーメッセージ
System.Reflection.MemberInfoをmyclassにキャストできない。

###該当のソースコード

C#

1using System; 2using System.Reflection; 3using System.Linq; 4 5public class MySheet 6{ 7 List<myclass> CheckedItems = new List<myclass>();//この型でOK? 8 9 static void Main(string[] args) 10 { 11 var sheet = new MySheet(); 12 sheet.SetItem("section", "Tokyo"); 13 System.Console.WriteLine(sheet.section); 14 } 15 16 internal void SetItem(string keyword, string value) 17 { 18 var member = typeof(MySheet).GetMembers( 19 BindingFlags.Public | BindingFlags.NonPublic | 20 BindingFlags.Instance | BindingFlags.Static | 21 BindingFlags.DeclaredOnly) 22 .Where(m => m.Name.Contains(keyword)) 23 .Where(m => m.MemberType == MemberTypes.Property) 24 .FirstOrDefault(); 25 26 ((PropertyInfo)member).SetValue(this, new myclass(value), null); 27 CheckedItems.Add(member); 28 } 29 30 public virtual myclass FiscalYear { get; set; } 31 public virtual myclass YearMonth { get; set; } 32 public virtual myclass OutputDate { get; set; } 33 public virtual myclass mycode { get; set; } 34 public virtual myclass section { get; set; } 35 36public class myclass{ 37 public string Name; 38 39 public myclass(string name){ 40 this.Name = name; 41 } 42} 43 44

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

Propertyをあとで呼ぶっていうのがよく分かりませんが、PropertyInfo自体を必要とするのであればZuishinさんの回答のとおりListの方の型を合わせればいいだけです。
もしそうではなく、myclassのリストが欲しいのであれば、SetValueする時にnew myclass(value)でmyclass型のインスタンスを作っているものをそのまま格納してしまえばいいだけではないでしょうか?

csharp

1var newmyclass = new myclass(value); 2((PropertyInfo)member).SetValue(this, newmyclass, null); 3CheckedItems.Add(newmyclass);

投稿2017/09/20 10:20

tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/09/22 05:36

ありがとうございます。 やってみたらそのとおりでした。 Propertyにはいろいろ値が入っているので、使ったものだけ後で参照したいと思ったのでした。 ちょっと時間が経ってしまって、自分でも忘れてしまいました。・・・。
guest

0

List<MemberInfo> に取っておけば良いだけのように思いますが、どうしてもキャストしなければならないならユーザー定義型変換演算子を定義してください。

投稿2017/09/20 09:55

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/09/21 09:25

MemberInfoからMyClassへ変換できません、とエラーになっているので、キャストが必要っぽいです。
Zuishin

2017/09/22 02:34

MemberInfo は MyClass を継承していないので型変換演算子を宣言しなければキャストできません。
cancat

2017/09/22 05:38

ありがとうございました。 List<MemberInfo> に取っておけば良いだけでした。 ちょっと時間が経ってしまって、自分でも必要な忘れてしまいました。・・・。 型変換演算子は初めてで、手強そうでした。・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問