2

私はこれを理解するのに非常に近いと思いますが、私はしばらくの間進歩しておらず、実際に周りに尋ねるしかありません。

GraphicsSettingsグラフィックプロパティの大規模なセットを持つクラスがあります。これらのプロパティには、比較ループに使用するプロパティ名のプレースホルダー値があります。

比較ループはクラス内の関数であり、グラフィックスプロパティの配列とStringreader外部テキストファイルの行を超えて実行されます。

ループがグラフィックスプロパティの値と行にあるものの一部との一致を見つけたら、行の値全体をグラフィックスプロパティに設定します。

ただし、ここに問題があります。クラス内からプロパティセッターを呼び出す方法がわかりません。名前を具体的に入力しないと、ループが発生するため、プロパティセッターを呼び出すことができません。

私は使用してみました:

this.GetType().GetProperty(key).SetValue(this,line, null);

ここで、「key」はプロパティ名、「line」は行の値です。私の理解では、これは外部からクラスオブジェクトを呼び出して値を設定する場合は問題なく機能するはずですが、このメソッドを使用して内部からクラスを呼び出すことはまったく反対のようです。

私が得るのは TargetInvocationException was unhandledエラーだけです。それほど驚くことではありませんが、これを回避する方法がわかりません。

だから私はそれがこれに帰着すると思います:プロパティが存在する同じクラス内から、文字列を使用してプロパティにアクセスするにはどうすればよいですか?

4

1 に答える 1

4

プロパティがパブリックでない場合、GetPropertyメソッドはターゲットクラス内から呼び出していることを知らないため、バインディングフラグを使用する必要がある場合があります。C#のアクセシビリティルールは静的コードテキストに適用され、ここでは適用されません。

PropertyInfo prop = this.GetType().GetProperty(key, BindingFlags.Instance | 
                                                    BindingFlags.NonPublic);
prop.SetValue(this, "data", null);

プロパティの検索では大文字と小文字が区別されることに注意してください。したがって、IgnoreCaseフラグも含める必要がある場合があります。

PropertyInfo prop = this.GetType().GetProperty(key, BindingFlags.Instance |
                                                    BindingFlags.NonPublic |
                                                    BindingFlags.IgnoreCase);
prop.SetValue(this, "data", null);

プロパティが静的である場合は、BindingFlags.Staticflagの代わりにBindingFlags.Instanceflagを指定します。両方を組み合わせるだけでなくBindingFlags.NonPublic | BindingFlags.Public、混合ケースの場合も組み合わせることができます。


タイプが一致する必要があることにも注意してください。ここでは、C#の暗黙的な型変換は機能しません。したがって、の値パラメーター(2番目のパラメーター)には常に正しいタイプを指定してくださいSetValue。例えば

string input = "123";
prop.SetValue(this, Int32.Parse(input), null);

int i = 77;
prop.SetValue(this, (double)i, null);

また、プロパティがタイプの場合は、intを明示的に変換します。doubledouble


Chris Kerekesはprop.MemberType、と組み合わせて使用​​してConvert.ChangeType、異なるタイプのプロパティがある場合に機能する完全に動的なアプローチを取得することを提案しています(少なくとも最も一般的なタイプの場合)。

prop.SetValue(this, Convert.ChangeType(line, prop.MemberType), null);
于 2013-03-04T13:02:40.353 に答える