Приведение прогнозируемого списка с использованием LINQ возвращает список нулевых значений? - PullRequest
4 голосов
/ 07 декабря 2011

Когда я пытаюсь привести спроецированный список в метод BuildTypes, я получаю список нулевых значений. Я также пытался использовать .Cast (), но я получаю сообщение об ошибке, что некоторые свойства не могут быть преобразованы. Я могу опубликовать ошибку, если это полезно. Вот мой код:

public class AuditActionType: EntityValueType
{
}

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType
{
    var types = 
        (from ty in xDocument.Descendants("RECORD")
         select new
            {
                Id = GenerateGuid(),
                Name = ty.Element("Name").Value,
                EntityStatus = _activeEntityStatus,
                DateCreated = DateTime.Now,
                DateModified = DateTime.Now
            } as T).ToList();

    return types;
} 

Так что я бы назвал это так:

var auditActorTypes = BuildTypes<AuditActorType>(auditActorTypesXml)

У меня есть тонна типов, которые мне нужно извлечь из файла XML, и я не хотел дублировать код для каждого типа.

Ответы [ 3 ]

7 голосов
/ 07 декабря 2011

Вы пытаетесь привести анонимный объект к типу T, что невозможно сделать.Анонимный тип - это его собственный уникальный тип, который никак не связан с переданным T.

Вместо этого можно указать ограничение new() для типа T, означающее, что для него требуется конструктор по умолчанию,и затем выполните new T() вместо создания нового анонимного типа:

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new()
{
    var types = 
        (from ty in xDocument.Descendants("RECORD")
         select new T()
            {
                Id = GenerateGuid(),
                Name = ty.Element("Name").Value,
                EntityStatus = _activeEntityStatus,
                DateCreated = DateTime.Now,
                DateModified = DateTime.Now
            }).ToList();

    return types;
} 

Это, конечно, при условии, что Id, Name, EntityStatus, DateCreated и DateModified все свойства базы EntityValueType.

4 голосов
/ 07 декабря 2011

Вы не можете сделать это с вашим текущим кодом, так как new { } создает анонимный тип , который не имеет отношения к T (он не является ни дочерним, ни тип T).Вместо этого вы можете реализовать Id, Name, EntityStatus, DateCreated и DateModified в качестве свойств вашего EntityValueType класса и изменить:

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType

На:

 private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new()

Указывает, что любой аргумент типа, передаваемый нашему методу, должен иметь конструктор без параметров, который позволяет использовать для фактического построения объекта типа T путем изменения:

select new { ... } as T

To:

select new T { ... }

Конечный результат:

public class EntityValueType
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    // Change this to the correct type, I was unable to determine the type from your code. 
    public string EntityStatus { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
}

public class AuditActionType: EntityValueType
{
}

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new()
{
    return (from ty in xDocument.Descendants("RECORD")
        select new T
            {
                Id = GenerateGuid(),
                Name = ty.Element("Name").Value,
                EntityStatus = _activeEntityStatus,
                DateCreated = DateTime.Now,
                DateModified = DateTime.Now
            }).ToList();
} 
1 голос
/ 07 декабря 2011

Изменить код:

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new()
{
    var types = 
        (from ty in xDocument.Descendants("RECORD")
         select new T()
            {
                Id = GenerateGuid(),
                Name = ty.Element("Name").Value,
                EntityStatus = _activeEntityStatus,
                DateCreated = DateTime.Now,
                DateModified = DateTime.Now
            }).ToList();

    return types;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...