我有个课
public class LDBList<T> : List<T> where T : LDBRootClass {
// typical constructor
public LDBList(LDBList<T> x) : base(x) { }
...
}
但是我希望有一个额外的构造函数,它接受一个不同的泛型类型的列表(例如A),以及一个将A转换为T的函数,然后从它构建T列表,类似于
public LDBList(
Func<A, T> converter,
IList<A> aList)
{
foreach (var x in aList) {
this.Append(converter(x));
}
}
所以converter
是A->T
类型的,所以我取一个A
列表,然后从它生成一个T
列表。我的类是由T
参数化的,所以这很好。
但它在抱怨“找不到类型或名称空间名称'A‘”。
好的,所以它需要类上的一个A
泛型参数(它真的不喜欢构造函数)。但我把它放在哪里,事实上,这甚至是可能的?
发布于 2020-10-04 04:26:00
我不相信您可以在这样的构造函数中添加额外的泛型类型。
我将重构转换器以完成LDBList实例的创建并返回实例,这样转换就像工厂一样从A的实例创建LDBLists。
public class Converter<T,A>
{
public LDbList<T> CreateLdbList(IList<A>) {
var list = new LdbList<T>();
// do the conversion here
return list;
}
}
然后,将用法更改为
var Converter<X,Y> = new Converter();
var result = Converter.Convert(originalData);
发布于 2020-10-04 04:25:47
理论上,您可以将额外的类型添加到类本身的泛型类型中:
public class LDBList<A, T> : List<T> where T : LDBRootClass
{
// typical constructor
public LDBList(LDBList<A, T> x) : base(x) { }
public LDBList(
Func<A, T> converter,
IList<A> aList)
{
foreach (var x in aList)
{
this.Append(converter(x));
}
}
}
当然,这意味着您需要使用一个额外的类型参数来声明该类型的实例,除非您使用特定的构造函数,否则您甚至不需要这个参数。那就不好了。
您可以像这样声明一个助手类:
public static class LDBListCreator
{
public static LDBList<T> CreateFrom<T, A>(Func<A, T> converter, IList<A> aList) where T: LDBRootClass
{
var result = new LDBList<T>();
result.AddRange(aList.Select(converter));
return result;
}
}
这假设LDBList<T>
有一个默认的构造函数。
但是在检查时,您应该能够看到创建这样一个简单的助手类是毫无意义的。如果将构造函数添加到接受IEnumerable<T>
(像List<T>
类一样)的list类中,如下所示:
public LDBList(IEnumerable<T> items) : base(items)
{
}
然后,只需使用LDBList<T>
就可以构造一个IEnumerable.Select()
实例。
例如,考虑到:
public class LDBRootClass
{
}
public class DerivedLDBRootClass : LDBRootClass
{
public DerivedLDBRootClass(string value)
{
// .. whatever
}
}
然后,您可以很简单地将List<string>
转换为LDBList<DerivedLDBRootClass>
,而不需要任何额外的脚手架,如下所示:
var strings = new List<string> { "One", "Two", "Three", "Four", "Five" };
var result = new LDBList<DerivedLDBRootClass>(strings.Select(item => new DerivedLDBRootClass(item)));
https://stackoverflow.com/questions/64194477
复制