Одновременное изменение нескольких полей объекта в Enumerable в C# - PullRequest
0 голосов
/ 07 мая 2020

Если у меня есть Enumerable объектов и я хочу изменить несколько полей одного, индекс которого мне уже известен, я сейчас это делаю:

var myObject = myEnumerable[index];
myObject.one = 1;
myObject.two = 2;

Есть ли способ это сжать? Чтобы упростить?

Например, в VB вы можете сделать:

With myEnumerable[index]
    .one = 1
    .two = 2
End With

PS: using здесь не работает, поскольку объекту необходимо реализовать IDisposable , мы не всегда контролируем объект. Я ищу общий c способ сделать это.

1 Ответ

0 голосов
/ 07 мая 2020

Ручной способ получить то, что вы хотели. Вы можете использовать его на любом объекте.

class Program
{
    static void Main(string[] args)
    {
        var item = new Item
        {
            One = 0,
            Two = 0
        };

        item.SetProperties(new string[] { "One", "Two" }, new object[] { 1, 2 });
    }
}

public class Item
{
    public int One { get; set; }
    public int Two { get; set; }
}

public static class Extensions
{
    public static void SetProperties<T>(this T obj, IEnumerable<string> propertiesNames, IEnumerable<object> propertiesValues)
    {
        if (propertiesNames.Count() != propertiesValues.Count())
        {
            throw new ArgumentNullException();
        }

        var properties = obj.GetType().GetProperties();

        for (int i = 0; i < propertiesNames.Count(); i++)
        {
            var property = properties.FirstOrDefault(x => x.Name == propertiesNames.ElementAt(i));

            if (property is null)
            {
                throw new ArgumentException();
            }

            property.SetValue(obj, propertiesValues.ElementAt(i));
        }
    }

    public static void SetFields<T>(this T obj, IEnumerable<string> fieldsNames, IEnumerable<object> fieldsValues)
    {
        if (fieldsNames.Count() != fieldsValues.Count())
        {
            throw new ArgumentNullException();
        }

        var fields = obj.GetType().GetFields();

        for (int i = 0; i < fieldsNames.Count(); i++)
        {
            var field = fields.FirstOrDefault(x => x.Name == fieldsNames.ElementAt(i));

            if (field is null)
            {
                throw new ArgumentException();
            }

            field.SetValue(obj, fieldsValues.ElementAt(i));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...