У меня есть 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;
}
}
Я знаю, что я поступаю неправильно и ожидаю, что кто-нибудь может указать, что может быть возможным решением - спасибо.
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;
}
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
public interface IPerson { List<T> Get<T>() where T : new(); }
Это странно, тем более что у вас есть отдельный (на первый взгляд несвязанный) классPerson
.IPerson
? Прямо сейчас это означает: «Вызывающий может указать любой класс, и IPerson вернет их список».List<Person> Get<Person>()
создает новый универсальный параметр с именем «Person» и имеет то же значение, что и Listnew T { id = "1001" ...}
, и это не имеет смысла.