У меня есть функция, возвращающая динамический список, и я хочу вернуть его обратно. Это возможно?
Моя функция:
public List<dynamic> GiveMeProjects(int id)
{
Entities.VSTMEntities vstm = new Entities.VSTMEntities();
var currentUserProject = (from users in vstm.Users
from project in users.Projects
where users.UserID == id
select new
{
Id = project.ProjectID,
Name = project.ProjectName
}).ToList<dynamic>();
return currentUserProject;
}
и называя это
[WebMethod()]
public List<dynamic> GiveMeProjects(string id)
{
int pId = Convert.ToInt32(id);
return projectItems.GiveMeProjects(pId);
}
Когда я тестирую службу, эта функция генерирует исключение
There was an error generating the XML document. ---> System.InvalidOperationException: f__AnonymousType102[System.Int32,System.String] cannot be serialized because it does not have a parameterless constructor. at System.Xml.Serialization.TypeDesc.CheckSupported() at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError) at System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException(Type type) at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write9_ArrayOfAnyType(Object o) at Microsoft.Xml.Serialization.GeneratedAssembly.ListOfObjectSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer) at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) --- End of inner exception stack trace --- at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces) at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue) at System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues) at System.Web.Services.Protocols.WebServiceHandler.Invoke()
Как решить эту проблему
Нельзя использовать ключевое слово С# dynamic. Поскольку вы теперь возвращаетесь, правильным способом является создание класса или структуры и возврат его.
public class ProjectOverview
{
public int Id { get; set; }
public int Name { get; set; }
}
public List<ProjectOverview> GiveMeProjects(int id)
{
Entities.VSTMEntities vstm = new Entities.VSTMEntities();
var currentUserProject = (from users in vstm.Users
from project in users.Projects
where users.UserID == id
select new ProjectOverview()
{
Id = project.ProjectID,
Name = project.ProjectName
}).ToList();
return currentUserProject;
}
Динамическое ключевое слово следует использовать только в особых случаях. Подробности можно найти в официальной статье MSDN. Если вы не хотите этого делать, вы можете проверить существующие классы, такие как KeyValuePair или Tuple. Однако это не рекомендуется. Сервис нуждается в четком интерфейсе, поэтому клиенты могут легко получить к нему доступ. Это лучше всего сделать, выставив пользовательский класс как возвращаемое значение (также в отношении расширения интерфейса в одной точке).
Id
иName
.