Вот простой метод с циклом 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 запланированным в любых будущих выпусках (например, вместе с дебютом С# 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;
}