Ale*_*lex 2 c# generics collections types interface
我有一组MyClass1, MyClass2, MyClass3实现接口(IMyClass)的classes ().
我有兴趣创建一个方法来填充和返回Collection.Generics.Lists<>具有公共接口MyClassX(List<IMyClass>)的对象的list ().但是怎么样?
每个类都有一个构造函数MyClassX,可以执行不同的操作.所以我无法创建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!!
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我尝试在下一个示例中使用泛型类型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!!
}
}
Run Code Online (Sandbox Code Playgroud)
我还试图MyClassX在方法的构造函数中外化代码,但我无法调用该方法,因为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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您调用Fill的地方,您可以选择IMyClass要使用的派生
string[] items = ...;
List<IMyClass> list1 = Fill(items, item => new MyClass1(item));
List<IMyClass> list2 = Fill(items, item => new MyClass2(item));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2058 次 |
| 最近记录: |