Вот простой метод с циклом foreach
:
IEnumerable<XElement> FieldsToXElements(object instance)
{
var fieldElements = new List<XElement>();
foreach (var field in instance.GetType().GetFields(instance))
{
fieldElements.Add(new XElement(field.Name, field.GetValue(instance)));
}
return fieldElements;
}
Вроде некрасиво. Если бы в LINQ был какой-либо оператор, означающий «что-то сделать» (например, выполнить Action
для каждого, выбранного в операторе LINQ), это выглядело бы лучше, более кратко:
IEnumerable<XElement> FieldsToXElements(object instance)
{
var fieldElements = new List<XElement>();
from field in instance.GetType().GetFields(instance))
let name = field.Name
let value = field.GetValue(instance)
do fieldElements.Add(new XElement(name, value));
return fieldElements;
}
Я понимаю, что это субъективно, и только мое мнение. По моему мнению, для цикла foreach, который имеет одну строку, которая просто вызывает метод, оператор "do
" имеет смысл. Но мне интересно, думал ли кто-нибудь из MS о том же. Планируется ли такой оператор LINQ в следующих выпусках (например, вместе с дебютом C # 4.0)?
Вот еще один пример с предикатом, где фиктивный оператор do
действительно сделает код более чистым. Это:
IEnumerable<XElement> FieldsToXElements
(object instance, Func<FieldInfo, bool> predicate)
{
var fieldElements = new List<XElement>();
foreach (var field in instance.GetType().GetFields(instance).Where(predicate))
{
fieldElements.Add(new XElement(field.Name, field.GetValue(instance)));
}
return fieldElements;
}
против. это:
IEnumerable<XElement> FieldsToXElements
(object instance, Func<FieldInfo, bool> predicate)
{
var fieldElements = new List<XElement>();
from field in instance.GetType().GetFields(instance))
let name = field.Name
let value = field.GetValue(instance)
where predicate(field)
do fieldElements.Add(new XElement(name, value));
return fieldElements;
}