0

多数のクラス (40 以上) があり、それぞれに多数のフィールド (通常は文字列またはリスト) があります。次に、各クラスで動作する約8〜10個の関数があります(ただし、関数は関連するクラスの一部ではありません...)。各関数は、動作するフィールド名を除いてほぼ同じです。そう:

public static class CMix{

    private static List<CType1> gListType1;
    private static List<CType2> gListType2;

    //...

    public static Tuple<bool, String> FetchType1F1(int aIndex){
        //Bounds checking + return item from gListType1.
    }

    public static Tuple<boo, String> FetchType1F2(int aIndex){
        //Bounds checking + return item from gListType1.
    }

    //...

    public static Tuple<bool, ulong> FetchType2AB2(int aIndex){
        //Bounds checking + return item from gListType2.
    }

}

public class CType1{
    public String mF1;
    public String mF2;
    public ulong mF3;
}

public class CType2{
    public String mAB1;
    public ulong mAB2;
}

上記のコードは、メソッドが単純な get/set メソッドであることを示唆していますが、簡潔にするためにこれを見逃していましたが、それよりも少し複雑です。これは、メソッドが一致するクラスの一部ではない理由でもあります (つまり、クラス CType1 の FetchType1F1)。

私を悩ませているのは、各メソッドの内容が、作業中のフィールドとリストを除いてほぼ同じであることです。ジェネリックを使用していくつかの基本的なメソッドを作成できると思いますが、正しいフィールドを参照する方法に苦労しています。

public static String FetchGenericString <ListType> (List<ListType> aList, int aIndex) {
    //For now return empty string.
    return "";
}

public static Tuple<bool, String> FetchType1F1(int aIndex){
    String mResult=FetchGenericString(gListType1, 0);
}

フィールド名を FetchGenericString に渡して呼び出す方法がわかりません。

String mResult=FetchGenericString(gListType1, 0, mF1);

これは問題の最善の解決策でさえないかもしれないので、どんな提案にも耳を傾けます。

ありがとうございました。

4

1 に答える 1

1

メソッドを変更して、検索するプロパティのアクセサーを含めることができます。

  public static TValue FetchValue<TList, TValue>(List<TList> aList, int aIndex, Func<TList, TValue> valueSelector)
    {
        return valueSelector(aList[aIndex]);
    }

それから電話する

String mResult=FetchGenericString(gListType1, 0, a => a.mF1);

ただし、追加する必要があるのは、変数名にこれらのプレフィックスを付けると、コードが読みやすくなるわけではありません。それらを削除することを検討する必要があります。

于 2012-06-14T10:33:41.630 に答える