У меня есть Interface, где я пытаюсь создать общий List<T> и динамически назначать ему объекты. Предположим следующее:

 public class Person
 {
    public string id { get; set; }
    public string name { get; set; }
 }

 public interface IPerson
 {
    List<T> Get<T>() where T :  new();
 }

Наконец, я попытался сделать следующее, чтобы передать список объектов человека:

class aPerson : IPerson
{
  public List<Person> Get<Person>() //The constraints for type parameter 'Person' of method 'Program.aPerson.Get<Person>()' must match the constraints for type parameter 'T' of interface method 'Program.IPerson.Get<T>()'
  {
    List<Person> aLst = new List<Person>()
    {
        new Person { id = "1001", name = "John" }, //Cannot create an instance of the variable type 'Person' because it does not have the new() constraint  
        new Person { id = "1002", name = "Jack" }
    };

    return aLst;
  }
}

Я знаю, что я поступаю неправильно и ожидаю, что кто-нибудь может указать, что может быть возможным решением - спасибо.

0
user8512043 10 Ноя 2019 в 10:26
2
public interface IPerson { List<T> Get<T>() where T : new(); } Это странно, тем более что у вас есть отдельный (на первый взгляд несвязанный) класс Person.
 – 
mjwills
10 Ноя 2019 в 10:28
1
 – 
mjwills
10 Ноя 2019 в 10:33
У меня много проблем с пониманием вашей объектной модели. Проще говоря, что это означает, когда тип реализует IPerson? Прямо сейчас это означает: «Вызывающий может указать любой класс, и IPerson вернет их список».
 – 
John Wu
10 Ноя 2019 в 11:00
Я не знаю, почему вы пытаетесь использовать общий для конкретного случая, который является классом Person, пожалуйста, дайте нам более подробную информацию о том, что вы хотите сделать?
 – 
sayah imad
10 Ноя 2019 в 13:38
Вы правы, ваши модификации просто не были очевидны (легко найти). Чтобы объяснить ошибку: public List<Person> Get<Person>() создает новый универсальный параметр с именем «Person» и имеет то же значение, что и List. Он не имеет абсолютно никакого отношения к классу Person. Таким образом, это заканчивается значением new T { id = "1001" ...}, и это не имеет смысла.
 – 
Holger
10 Ноя 2019 в 14:32

1 ответ

То, как вы используете универсальный интерфейс, неверно, вы не можете точно указать тип T при реализации универсального интерфейса. На самом деле универсальные интерфейсы — это способ расширения определенного вами интерфейса на основе классов.

public interface IPerson<T>
{
    List<T> Get();
}

class aPerson : IPerson<Person>
{
    public List<Person> Get() 
    {
        var aLst = new List<Person>()
        {
            new Person { id = "1001", name = "John" },
            new Person { id = "1002", name = "Jack" }
        };
        return aLst;
    }
}
0
Seyedraouf Modarresi 10 Ноя 2019 в 14:43