C# - 在泛型属性中使用ICollection <t>而不是Collection <t>

时间:2018-01-08 15:43:52

标签: c# asp.net-mvc generics

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>

我搜索了类似的问题,但我只找到了一个关于如何创建通用属性的示例

2 个答案:

答案 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)
    {

    }
}