我正在尝试访问子类中的泛型类型属性。在下面的例子中,我重新创建了我的问题。是否有解决此问题的方法,或者根本不可能?提前谢谢!
编辑:无法将集合声明为A<Model>
或A<T>
。
public abstract class Model {
public int Id { get; }
}
public interface I<T> where T: Model {
ICollection<T> Results { get; }
}
public abstract class A { }
public class A<T> : A, I<T> where T : Model {
public ICollection<T> Results { get; }
}
public class Example {
A[] col;
void AddSomeModels() {
col = new A[] {
new A<SomeModel>(),
new A<SomeOtherModel>()
}
}
void DoSomethingWithCollection() {
foreach (var a in col) {
// a.Results is not known at this point
// is it possible to achieve this functionality?
}
}
}
答案 0 :(得分:5)
如果没有妥协,你就不能做你想要的事。
首先,您需要在I<T>
中设置界面T
协变:
public interface I<out T> where T : Model
{
IEnumerable<T> Results { get; }
}
因此,第一个妥协是T
只能是输出。 ICollection<T>
中的T
不具有协变性,因此您需要将Results
的类型更改为IEnumerable<T>
。
执行此操作后,以下是类型安全的,因此允许:
public void DoSomethingWithCollecion()
{
var genericCol = col.OfType<I<Model>>();
foreach (var a in genericCol )
{
//a.Results is now accessible.
}
}