0

オブジェクトのプロパティにタイプとしてアクセスできますか?

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そのため、 「書きたいこと」のサンプルコードでデリゲートパラメータの型として使っていたので、型はありません。

私は正しいですか、それとも私が望むように実装する方法はありますか?

4

2 に答える 2