オブジェクトのプロパティにタイプとしてアクセスできますか?
Text
オブジェクトのコレクションを反復処理し、読み取りまたは書き込みのためにこれらのオブジェクトの 2 つのプロパティにアクセスする必要がある API を使用しています。現在、次のように読み書きするための2つの方法があります。
Result ReadTexts()
var attribs = SOME_CODE;
string first = "", second = "";
for(int i=1 ; i <= attribs.Count ; i++) {
if(attribs[i] IS_FIRST_ONE_NEEDED) {
first = attribs[i].Text;
} else if(attribs[i] IS_SECOND_ONE_NEEDED) {
second = attribs[i].Text;
}
}
return new Result(first, second);
}
void WriteTexts(string first, string second) {
var attribs = SOME_CODE;
for(int i=1 ; i <= attribs.Count ; i++) {
if(attribs[i] IS_FIRST_ONE_NEEDED) {
attribs[i].Text = first;
} else if(attribs[i] IS_SECOND_ONE_NEEDED) {
attribs[i].Text = second;
}
}
}
私が好むのは、このコードを繰り返すのではなく、反復を除外してコレクション内の 2 つのオブジェクトを 1 つのメソッドにチェックする、より機能的なスタイルを使用することです。上記のサンプルコード。この 1 つの方法は次のようになります。
void AccessTexts(Action<StringProperty> first, Action<StringProperty> second) {
var attribs = SOME_CODE;
for(int i=1 ; i <= attribs.Count ; i++) {
if(attribs[i] IS_FIRST_ONE_NEEDED) {
first(attribs[i].Text);
} else if(attribs[i] IS_SECOND_ONE_NEEDED) {
second(attribs[i].Text);
}
}
}
そして、これを次のようなラムダ式で呼び出します
AccessTexts(( prop => prop = "abc"), ( prop => prop = "def"));
書くため、または
AccessTexts(( prop => firstString = prop), ( prop => secondString = prop));
読むために。これははるかに短くなり、多くのコードを繰り返す必要がなくなります。
しかし、プロパティは.netで実際の型として公開されておらず、特別なメソッド(ゲッターとセッター)の可用性に基づいているだけなので、これは不可能だと思います。StringProperty
そのため、 「書きたいこと」のサンプルコードでデリゲートパラメータの型として使っていたので、型はありません。
私は正しいですか、それとも私が望むように実装する方法はありますか?