我有一组实现接口(MyClass1, MyClass2, MyClass3)的类(IMyClass)。

我对创建一种方法来填充并返回具有公共接口Collection.Generics.Lists<> MyClassX)的对象的列表(List<IMyClass>)感兴趣。但是如何?

每个类都有一个构造函数MyClass X,它们的功能有所不同。因此,我无法创建BaseClass并对所有对象使用通用的构造函数。

通过接口我不能做:

public List<IMyClass> Fill(string[] ItemsPassedByParam, IMyClass InstanceOfMyClassX)
    List MyList = new List<IMyClass>();
    foreach (item in ItemsPassedByParam)
    {
        MyList.Add (new IMyClass (item)); //can't do new from an Interface!!
    }
}


我还尝试在下一个示例中使用泛型类型TMyClass,但两者都对我没有用(尽管我对泛型类型的理解并不深):

public List<TMyClass> Fill(string[] ItemsPassedByParam, Type TypeOfMyClassX)
    List MyList = new List <TMyClass> ();
    foreach (item in ItemsPassedByParam)
    {
        MyList.Add (new TMyClass (item)); //can't do new from a Generic Type!!
    }
}


我也尝试在方法中将MyClass X的构造函数内部的代码外部化,但是由于de object未初始化(没有new ()),所以无法调用该方法。

在这些情况下,哪种解决方案?

提前致谢!

最佳答案

听起来您想让Fill方法根据传入的字符串值(其中List<T>T的派生)创建一个IMyClass

您需要做的是将工厂函数传递给Fill方法,该方法允许创建IMyClass派生实例。

public List<IMyClass> Fill(
  string[] ItemsPassedByParam,
  Func<string,IMyClass> createFunc)

  List MyList = new List<IMyClass>();
  foreach (item in ItemsPassedByParam) {
    MyList.Add(createFunc(item));
  }
}


然后,在您称为Fill的位置,您可以选择要使用的IMyClass派生形式

string[] items = ...;
List<IMyClass> list1 = Fill(items, item => new MyClass1(item));
List<IMyClass> list2 = Fill(items, item => new MyClass2(item));

10-08 14:02