用参数编写通用函数的更好方法是不同的类

时间:2015-11-05 07:14:46

标签: list c#-4.0

在我的项目中,我有一些类似的功能:

func 1(包含2个类:class1和classs1_1):

List<class1> GetData1(class1_1 cls)
{
    List<class1> list = new List<class1>();
    cls = new cls();
    //do something for cls, like cls.GetSpecialCase();

    //fill data from cls to list, as using foreach to fill data to list

    return list;
}

func 2(包含2个类:class2和classs2_2):

List<class2> GetData2(class2_2 cls)
{
    List<class2> list = new List<class2>();
    cls = new cls();
    //do something for cls, like cls.GetSpecialCase();

    //fill data from cls to list, as using foreach to fill data to list

    return list;
}

我怎么能写这样的函数(因为我不想使用上面的很多函数):

common func(T为class1,object cls为class1_1):

List<T> GetData(object cls)
{
    List<T> list = new List<T>();
    //how to recognize which class of cls
    if(cls == class1_1)     class1_1 other_cls = cls as class1_1;
    if(cls == class2_2)     class2_2 other_cls = cls as class2_2;
    //do something for other_cls 

    //fill data from other_cls to list
    return list;
}

我只想将参数作为对象传递,并且在常用函数中,我想知道我传递给哪个类,以便我可以对待正确的类,并调用正确的函数。

任何人都可以帮助我解决这个问题。

非常感谢。

2 个答案:

答案 0 :(得分:3)

听起来你需要:

  • 具有GetSpecialCase方法
  • 的接口或抽象基类
  • 的通用方法(包含输入和输出的类型参数)
    List<TResult> GetData<T, TResult>(T item) where T : ISpecialCase<TResult>
    {
        List<TResult> list = new List<TResult>();
        var other = item.GetSpecialCase();
        // Fill list via other
        return list;
    }
    

如果您不能引入接口或基类,可以使用动态类型,但我强烈建议您使用多态来表达不同类中的内容如果可能的话,可以使用common {GetSpecialCase

答案 1 :(得分:0)

您也可以使用泛型作为输入类型。 你的代码可能是这样的:

List<T> GetData<T>(T cls)
{
    List<T> list = new List<T>();
    //no need to recognize which class of cls

    //do something for other_cls 

    //fill data from other_cls to list
    return list;
}

并且两个类都需要实现相同的接口,因此您不需要知道它是哪种类型......