Как мне пройти через все поля в объекте в C #? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть такой объект:

public class Filters {
    public int var1 = 1, 
          var2 = 2, 
          var3 = 3;
}

Я объявляю этот объект здесь:

Filters filter1 = new Filters();

И я хочу получить доступ к var1, var2 и var3 в цикле и что-то с этим сделать. т.е.:

foreach (var prop in filter1.props) {
    Console.WriteLine(filter1[prop] + 3);
}

и вывод будет:

4
5
6

Я думаю, мне нужно сделать цикл foreach для каждого свойства, используя foreach(PropertyInfo p in filter1.GetType().GetProperties()), но я не знаю, как 1) перебрать реквизиты var1, var2, var3 и 2) как установить подпункт из filter1, используя имя, хранящееся в переменной

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Альтернативным ответом на ваш вопрос может быть следующий, скажем, у вас есть класс фильтров, подобный следующему

public class Filter 
{
    public IDictionary<string, object> Properties { get; } = new Dictionary<string, object>();
}

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

Что касается реального ответа, как указывалось в комментариях многих, если вы хотите итерировать свойств , то вам следует использовать их.В своем примере кода вы предоставили поля .

Так что ваш класс Filter, вероятно, в конечном итоге будет выглядеть так (обратите внимание, что я думаю, что var1 ... var3 - самые ужасныеимена, которые вы можете использовать, поскольку я не могу представить, что они могут определить в конце):

public class Filter 
{
    public int Var1 { get; set; } = 1;
    public int Var2 { get; set; } = 2;
    public int Var3 { get; set; } = 3;
}

, и тогда вы можете получить что-то похожее на:

var filter = new Filter();
var filterType = filter.GetType();
var readableProperties = filterType.GetProperties().Where( p => p.GetGetMethod() != null );

foreach (var property in readableProperties) 
{
    var value = (int)property.GetValue( filter );
    Console.WriteLine( $"{property.Name} =  {value + 3}" );
}

Чтобы убедиться, что вы выбираете толькоте, которые вы на самом деле хотите, вы можете, конечно, проверить имя, если оно равно Var1, Var2, Var3 или соответствует выражению регулярного выражения, или все, что вы хотели думать;)

Пример кода здесь, вы можетенайдите в этом dotnetfiddle (хотя без автопринадлежностей и $)

0 голосов
/ 16 ноября 2018

Спасибо всем, кто ответил - пара подсказок помогла мне добраться туда. Я только начал в C #, поэтому я не знал, что такое поля / реквизиты, так что спасибо @SeM @John. Но с этим и с ответами @Icepickle & @arslanaybars с GetProperties(), но вместо полей:

        FieldInfo[] fields = typeof(GeneralFilters).GetFields();
        for (int i = 0; i < fields.Length; i++)
        {
            //MANIPULATE HERE
            BlankTemplate tempFilter = (BlankTemplate)fields[i].GetValue(filters);
            // Ignore this for now.       tempFilter.selectedItems;
        }

где здесь указан BlankTemplate:

public class BlankTemplate
{
    public string[] selectedItems;
    public bool selectAll = false;
}

А теперь в tempFilter у меня есть объект, который мне нужно использовать на каждой итерации

Спасибо !!!

Редактировать: я понимаю, что это не отвечает на вопрос о том, как подмножество, используя строковое имя полей объекта. То, что я предполагал ранее, - это создание массива имен полей, затем циклический просмотр и подстановка данных в полях с использованием имен полей, как в javascript:

var fieldNames = Object.keys(filterObject);
for (var i = 0; i < fieldNames.length; i++) {
    doSomething( filterObject[fieldNames[i]] );
}

Но в C # * 1016 все немного по-другому

0 голосов
/ 16 ноября 2018

Если вы описываете свою переменную как свойства, подобные ниже,

public class Filters
{
    public int var1 { get; set; } = 1;
    public int var2 { get; set; } = 2;
    public int var3 { get; set; } = 3;
}

Вы можете получить доступ к этим свойствам с помощью

GetType (). GetProperties ()

тогда основной метод даст вам то, что вы просите

static void Main(string[] args)
{
    Filters filter1 = new Filters();

    foreach (var prop in filter1.GetType().GetProperties())
    {
        Console.WriteLine("{0}={1}", prop.Name, (int)prop.GetValue(filter1, null) + filter1.GetType().GetProperties().Length);
    }

    Console.ReadKey();
}

Результат будет

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