使用泛型来简化许多非常相似的方法

时间:2012-06-14 10:24:45

标签: c# generics

我有许多类(超过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;
}

上面的代码表明这些方法只是简单的获取/设置方法,它们比这更复杂,尽管为了简洁起见,我错过了这个。这也是为什么这些方法不是匹配类的一部分的原因(即类CType1中的FetchType1F1)。

困扰我的是,除了处理的字段和List之外,每个方法的内容几乎完全相同。我想我可以使用泛型来创建几个基本方法,但我正在努力研究如何引用正确的字段:

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);

这甚至可能不是问题的最佳解决方案,所以我会听取任何建议。

谢谢。

1 个答案:

答案 0 :(得分: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);

必须添加,但这些变量名前缀不会使您的代码读取变得非常简单。你应该考虑删除它们。