前提・実現したいこと
プロパティ値をメイン処理の分岐により動的に取得したいと考えていますが、
下記エラーが発生して実現できていません。
発生している問題・エラーメッセージ
System.Reflection.TargetException: '非静的メソッドにはターゲットが必要です。'
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace ConsoleApp1 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 var ropertyName = string.Empty; 14 switch (args[0]) 15 { 16 case "1": 17 ropertyName = "num1"; 18 break; 19 case "2": 20 ropertyName = "num2"; 21 break; 22 case "3": 23 ropertyName = "num3"; 24 break; 25 } 26 27 var testclass = new TestClass(); 28 object o = null; 29 testclass.GetType().GetProperty(ropertyName).GetValue(o); 30 Console.WriteLine(o.ToString()); 31 Console.ReadLine(); 32 } 33 } 34 35 class TestClass 36 { 37 public int num1 { get; set; } = 1; 38 public int num2 { get; set; } = 2; 39 public int num3 { get; set; } = 3; 40 } 41} 42
試したこと
メッセージの内容の"ターゲットが必要"の部分がよくわからないためTargetExceptionについて調べましたがnullではないことは確認できましたので原因がわかりませんでした。
TargetException は、null オブジェクトで静的ではないメソッドを呼び出そうとしたときにスローされます。 これは、呼び出し元にメンバーへのアクセス権がないか、またはターゲットでメンバーが定義されていないために発生する可能性があります。
https://docs.microsoft.com/ja-jp/dotnet/api/system.reflection.targetexception?view=net-6.0
補足情報(FW/ツールのバージョンなど)
.NET FrameWork 4.6.2
以下、修正依頼により2022/03/02追記
動的に取得したい理由については下記になります。
①サンプルコードのTestClassに当たるクラスは顧客希望によりインターフェースはあるものの、
どういったクラスであるかはアプリは関知しなくても動作する必要がある。
②ropertyName を取得するSwitch処理の部分も実際の実装では外だしされたJsonファイルを解析して取得したString(プロパティ名)であり、
どういったプロパティ名でTestClassに当たるクラスに対してどのプロパティ値を取得するかは監視しなくても動作する必要がある。
異常を踏まえリフレクションによるプロパティ値の動的取得が必要であると考えています。
回答1件
あなたの回答
tips
プレビュー