C# 声明类必须具有ICollection的接口<;T>;所有物

C# 声明类必须具有ICollection的接口<;T>;所有物,c#,interface,C#,Interface,我想创建一个接口,声明类必须至少有一个ICollection属性 public interface ILinked<T> where T : class, IModel { ICollection<T> LinkedT { get; set; } } 公共接口i链接,其中T:class,IModel { ICollection LinkedT{get;set;} } 但是我希望实现类可以自由选择属性的实际名称。这可能吗?这是不可能

我想创建一个接口,声明类必须至少有一个ICollection属性

   public interface ILinked<T> where T : class, IModel
    {
        ICollection<T> LinkedT { get; set; }
    }
公共接口i链接,其中T:class,IModel
{
ICollection LinkedT{get;set;}
}
但是我希望实现类可以自由选择属性的实际名称。这可能吗?

这是不可能的;在C#中,接口不能在不声明名称的情况下单独定义类型和访问修饰符

当您制定“如果ICollection至少有一个属性”的要求时,也许可以通过定义类型为
ICollection
的属性来解决问题,这是不可能的;在C#中,接口不能在不声明名称的情况下单独定义类型和访问修饰符

当您制定“如果ICollection,则至少有一个属性”的要求时,也许可以通过定义类型为
ICollection

的属性来解决问题,在某种程度上,是的。您只需指定类的哪个属性是实现接口属性的属性——毕竟,可能有多个具有该签名的属性,并且编译器需要知道在访问
SomeVariableOfTypeLinkedT.LinkedT
时要做什么。这可以通过以下方式实现

为此,C#需要一点锅炉板代码

class MyClass : ILinked<MyParameter> {
    public ICollection<MyParameter> SomeArbitraryProperty { get; set; }

    ICollection<MyParameter> ILinked<MyParameter>.LinkedT
    { 
        get { return SomeArbitraryProperty; }
        set { SomeArbitraryProperty = value; }
    }
}
在某种程度上,是的。您只需指定类的哪个属性是实现接口属性的属性——毕竟,可能有多个具有该签名的属性,并且编译器需要知道在访问
SomeVariableOfTypeLinkedT.LinkedT
时要做什么。这可以通过以下方式实现

为此,C#需要一点锅炉板代码

class MyClass : ILinked<MyParameter> {
    public ICollection<MyParameter> SomeArbitraryProperty { get; set; }

    ICollection<MyParameter> ILinked<MyParameter>.LinkedT
    { 
        get { return SomeArbitraryProperty; }
        set { SomeArbitraryProperty = value; }
    }
}

为什么要强制执行此特定标准?通过这样做,您试图解决哪个问题?使用其中一个对象的代码如何利用此接口?我正在编写一个MVC应用程序。对于模型,我使用EF。许多模型类都具有导航属性。大多数模型都有一个编辑/创建视图模型。这些模型实现一个IModel接口(只是声明它们有一个Int-Id属性)和一个或多个ICollection-LinkedT属性(取决于它们所链接的其他模型)。当获取后期操作的信息时,我使用ViewModel中的数据填充模型。对于“链接”属性,这将生成一个列表。链接内容的Id列表。为了简化操作,我为iLink接口提供了一组扩展方法,用于比较模型和ViewModel并“同步”数据。这些表达方法具有相同的结构和逻辑。唯一的区别是它们对不同的类T和不同的LinkedT属性进行操作。我想让它更通用,并且只有一个扩展方法。为什么要强制执行这个特定的标准?通过这样做,您试图解决哪个问题?使用其中一个对象的代码如何利用此接口?我正在编写一个MVC应用程序。对于模型,我使用EF。许多模型类都具有导航属性。大多数模型都有一个编辑/创建视图模型。这些模型实现一个IModel接口(只是声明它们有一个Int-Id属性)和一个或多个ICollection-LinkedT属性(取决于它们所链接的其他模型)。当获取后期操作的信息时,我使用ViewModel中的数据填充模型。对于“链接”属性,这将生成一个列表。链接内容的Id列表。为了简化操作,我为iLink接口提供了一组扩展方法,用于比较模型和ViewModel并“同步”数据。这些表达方法具有相同的结构和逻辑。唯一的区别是它们对不同的类T和不同的LinkedT属性进行操作。我喜欢使它更通用,并且只有一个扩展方法。