我有一组实现接口(MyClass1, MyClass2, MyClass3
)的类(IMyClass
)。
我对创建一种方法来填充并返回具有公共接口Collection.Generics.Lists<>
MyClass
(X
)的对象的列表(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));