在界面中创建通用List属性

时间:2019-02-06 09:51:58

标签: c#

我需要创建一个这样的界面:

public interface ISomething
{
    List<T> ListA { get; set; }
    List<T> ListB { get; set; }
}

然后像这样实现它:

public class Something01: ISomething
{
    public List<string> ListA { get; set; }
    public List<Person> ListB { get; set; }
}

或者这样:

public class Something02: ISomething
{
    public List<int> ListA { get; set; }
    public List<string> ListB { get; set; }
}

但是看着other posts,似乎我必须在接口类的顶部定义T。在实现时,这迫使我对所有属性使用一种特定类型。可以通过某种方式做到吗?

谢谢

4 个答案:

答案 0 :(得分:4)

您可以使接口具有通用性,并为每个需要使用不同类型的属性提供一个类型参数,例如:

public interface ISomething<TA, TB>
{
    List<TA> ListA{ get; set; }
    List<TB> ListB {get; set; }
}

并像这样使用它:

public class Something01: ISomething<string, Person>
{
    public List<string> ListA { get; set; }
    public List<Person> ListB { get; set; }
}

答案 1 :(得分:2)

  

“但是,在其他帖子中,似乎必须在T的顶部定义T   我的界面类。迫使我成为所有人的一种特定类型   实现时的属性。 “

是的。但是,您可以根据需要定义任意数量的通用参数,而不仅仅是单个参数。因此,在您的情况下,应该这样做:

public interface ISomething<T, S>
{
    List<T> ListA{ get; set; }
    List<S> ListB {get; set;}
}

现在您可以提供两种完全独立的类型:

class MyClass : ISomething<Type1, Type2> { ... }

答案 2 :(得分:1)

您可以使用

public interface ISomething<T, U>
{
    List<T> ListA{ get; set; }
    List<U> ListB {get; set;}
}

因此,当您定义班级时,应该是

public class Something : ISomething<Person, string>
{
    List<Person> ListA{ get; set; }
    List<string> ListB {get; set;}
}

答案 3 :(得分:1)

尝试此代码。

public interface ISomething<T, K>
  {
    List<T> ListA { get; set; }
    List<K> ListB { get; set; }
  }

  public class Something01 : ISomething<string, Person>
  {
    public List<string> ListA { get; set; }
    public List<Person> ListB { get; set; }
  }