返回一个包含泛型List的类

本文关键字:包含 泛型 List 的类 一个 返回 | 更新日期: 2023-09-27 17:51:16

我试图在c#(5.0)中构建一个类,我可以使用它作为基类,它包含一个列表,但列表可以是2种不同的类型。我想做以下事情:

public class BaseC
{
    string header { get; set; }
    List<object> recs  { get; set; }
}
public class derive1: BaseC
{
    List<myclassA> recs;
}
public class derive2: BaseC
{
    List<myclassB> recs;
}

重要的是,我要做的是返回从另一个类中的方法派生的类:

public BaseC PopulateMyDerivedClass()
{
    BaseC b = new BaseC();
    b.header = "stuff";
    b.recs =  FileHelperEngine<myclassB> fhe.ReadStringAsList(x);
}

方法PopulateMyDerivedClass实际上对derive1derive2做了完全相同的事情,只是它返回不同类型的列表。

我想我需要泛型。但是,在基类级别,也是PopulateMyDerivedClass然后应该返回一个泛型吗?我想也许我不是在处理多态性,但你可以猜到我是泛型新手,所以挣扎。

返回一个包含泛型List的类

我认为您想要的是使BaseC成为泛型类,并在定义派生类时指定泛型:

public class BaseC<T>
{
   //...
   virtual List<T> Recs { get; set; }
}
public class Derived1 : Base<MyClassA>
{
    override List<MyClassA> Recs { get; set; }
}

Alexei Levenkov说得好:

通常注意:在这种情况下,DerivedX类将不像原始样本那样有共同的父类。如果需要将DerivedX视为具有公共父/接口,则可能需要添加更多的类层(作为BaseC的非泛型父类)或使用接口。

我觉得你的代码设计需要重新思考。首先,通常当我们谈论"多态性"时,我们通常谈论的是多态行为(方法),而不是成员。我认为你可能想要考虑两个实现一个接口的类,这个接口做所有你想让每个类做的事情(将数据解析成自己的列表类型,并根据你的需要对它进行操作)。

尽管如此,在不了解代码细节的情况下,我认为这样的东西可能是您想要实现的:

public class BaseC<T>
{
    string header { get; set; }
    public List<T> recs {get;set;}
}

public BaseC<T> PopulateClass<T>()
{
    var b = new BaseC<T>();
    b.recs = new List<T>();
    T first = (T)Convert.ChangeType("1", typeof(T));
    b.recs.Add(first);
    return b;
}

和检查我们的理智:

BaseC<String> d1 = PopulateClass<String>();
System.Diagnostics.Debug.Print(d1.recs.First().ToString());
System.Diagnostics.Debug.Print(d1.recs.First().GetType().ToString());
BaseC<int> d2 = PopulateClass<int>();
System.Diagnostics.Debug.Print(d2.recs.First().ToString());
System.Diagnostics.Debug.Print(d2.recs.First().GetType().ToString());

打印

1
System.String
1
System.Int32