我想有一个ICollection<T2>
的扩展方法,女巫返回给我IReadOnlyCollection<T1>
。我需要的所有这些都是为了避免在代码中重复我自己。我有以下代码:
public static IReadOnlyCollection<T1> All<T1, T2>(this ICollection<T2> storage) where T1 : T2
{
if (storage.Count > 0)
{
return new List<T1>(storage);
}
else
{
return new List<T1>();
}
}
但不幸的是,它无法编译。
因此,让我们看一下上面的简单示例:
public interface IDatabase {}
public class Database : IDatabase, IDisposable {}
public static IReadOnlyCollection<T1> All<T1, T2>(this ICollection<T2> storage) where T2 : T1 where T1 : new()
{
// compiles
List<Database> derivedList = new List<PublishedDatabase>();
List<IDatabase> baseList = new List<IPublishedDatabase>(derivedList);
// doesn't compile
// with casting it works
List<T2> derivedListT = new List<T2>();
List<T1> baseList1T = new List<T1>(derivedListT/* as IEnumerable<T1>*/);
//...
}
我可以通过泛型使用嵌套类列表来创建基类列表,而无需强制转换吗?
最佳答案
我可能误解了这里的约束,但是您可以尝试使用dynamic
来掩盖分析仪
public static IReadOnlyCollection<T1> All<T1, T2>(this ICollection<T2> storage) where T2: T1
{
dynamic temp = storage;
return new ReadOnlyCollection<T1>(new List<T1>(temp));
}
...
var list = new List<SomeChild>()
{
new SomeChild()
};
var interfaces = list.All<ISomeBase, SomeChild>();
注意:如果您的代码分析器在抱怨强制转换,您可能会认为他们会更难抱怨
dynamic
...也是完全未经测试的,也许有更好的方法可以做到这一点关于c# - 如何通过泛型使用嵌套类列表创建基类列表而无需强制转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55335911/