Collection<T>
是一个类,ICollection<T>
是一个接口。
在MVC教程中我找到了这个
public virtual ICollection<Enrollment> Enrollments { get; set; }
但ICollection
是一个界面,我不明白为什么会这样。实现通用属性的正确方法是:
public MyProp<int> SomeProperty { get; set; }
因此,通过示例,它应该类似于
public Collection<int> SomeProperty { get; set; }
ICollection
是一个接口,因此它的实现应该是:
public class ClassName : ICollection<T>
我搜索了类似的问题,但我只找到了一个关于如何创建通用属性的示例
答案 0 :(得分:1)
这种方法完全有意义,因为类被设计为封装自己的底层实现。此外,Interfaces旨在标准化这种方法。要更好地理解它,请考虑IEnumarable<T>
接口。如果您在任何类设计上实现此接口,您的类将自动变为可枚举(这意味着它可以与foreach一起使用)。
在您的情况下,它会返回ICollection<T>
,因为他们希望您使用标准化的界面方法。
如果您编写以下代码
var enrollment = myObj.Enrollments
注册变量将自动视为以下
ICollection<Enrollment> enrollment = myObj.Enrollments
这种方法促使您编写具有更好设计的模块化代码,因为您最终使用标准化接口调用。
在每种情况下,您有时需要创建例外。如果出现类似的内容,您基本上可以使用要转换的类型,如下所示。
Collection<Enrollment> enrollment = myObj.Enrollments
通过这种方法,您可以访问来自Collection<T>
类
答案 1 :(得分:0)
实现泛型接口的类本身就是通用的,这是完全正常的。例如,List<T>
实现了IList<T>
。
或者,例如,
public interface IDoesSomethingWith<T>
{
void DoSomethingWith(T theThing);
}
public class DoesSomethingWith<T> : IDoesSomethingWith<T>
{
public void DoSomethingWith(T theThing)
{
throw new NotImplementedException();
}
}
可以在类级别或方法级别声明泛型类型参数。例如,您可以这样做:
public class DoesSomethingWith<T> : IDoesSomethingWith<T>
{
public void DoSomethingWith(T theThing)
{
// uses generic type of class
}
public void DoSomethingWith<TAnotherThing>(TAnotherThing anotherThing)
{
// uses generic type of method
}
public void DoSomethingWith<TAnotherThing>(T thing, TAnotherThing anotherThing)
{
// uses generic type of class and method
}
}
通用接口(或继承自泛型类的类)的实现可以指定具体类型而不是通用本身。
在此示例中,接口是通用的,但实现它的类不是。
public interface IDoesSomethingWith<T>
{
void DoSomethingWith(T theThing);
}
public class DoesSomethingWithInt : IDoesSomethingWith<int>
{
public void DoSomethingWith(int theThing)
{
}
}