Использование LINQ для создания списка <T>, где T: someClass <U> - PullRequest
14 голосов
/ 17 ноября 2011

Это связано с моим предыдущим вопросом Преобразование общего списка в C # в список, реализующий класс

У меня есть следующий код:

public abstract class DataField
{
    public string Name { get; set; }
}

public class DataField<T> : DataField
{
    public T Value { get; set; }
}

public static List<DataField> ConvertXML(XMLDocument data) {  
     result = (from d in XDocument.Parse(data.OuterXML).Root.Decendendants()
                      select new DataField<string>
                      {
                          Name = d.Name.ToString(),
                          Value = d.Value
                      }).Cast<DataField>().ToList();  
    return result;
}

Это работает, однако я хотел бы иметь возможность изменить выделенную часть запроса LINQ так, чтобы она была такой:

select new DataField<[type defined in attribute of XML Element]>
{
  Name = d.Name.ToString(),
  Value = d.Value
}

Это просто плохой подход? Является ли это возможным? Есть предложения?

Ответы [ 11 ]

1 голос
/ 17 ноября 2011

Это не невозможно, так как вы можете сделать это с помощью отражения.Но это не то, для чего были созданы дженерики, и это не то, как должно быть сделано.Если вы собираетесь использовать отражение для создания универсального типа, вы также можете вообще не использовать универсальный тип и просто использовать следующий класс:

public class DataField
{
    public string Name { get; set; }
    public object Value { get; set; }
}
...