Перебрать все объекты в классе во время компиляции C#

Мне нужно объединить все свойства в моем классе во время компиляции, чтобы построить строку. Я встречал похожие вопросы, но все они касались сценариев выполнения. По сути, у меня есть тысяча объектов недвижимости, и я бы предпочел не перечислять их снова вручную. Я знаю об использовании отражения для использования typeof (X) .getProperties (...), но мне не нужно никакого снижения производительности за то, что я делал это во время выполнения с отражением. Есть ли способ перебрать все свойства в моем классе, чтобы создать строку из всех моих свойств?

    Class1 : SomeInterface
    {
            int1;
            int2;
            ...
            int1000;
            string stringOfAllProperties;

            public getAllPropertiesAsString()
            {
               return stringOfAllProperties = int1+int2+int3...;
            }       
     }

Сделайте это вручную или используйте отражение. Вы могли бы сделать вставку в стиле АОП, но это кажется излишним. Отражение так плохо для вас? Вам В самом деле нужна такая высокая производительность, что отражение будет даже заметно? Наконец, это действительно необычная вещь, которая кажется проблемой XY. Чего вы пытаетесь этим достичь?

DavidG 04.09.2018 18:16

«У меня тысяча объектов недвижимости, и я бы предпочел не делать этого». На этом следует заканчивать предложение.

TheSoftwareJedi 04.09.2018 18:19

@DavidG прямо сейчас производительность имеет большое значение, потому что каждое из этих полей декодирует данные UDP, и мне нужно записать строку в файл по мере ее поступления. Прямо сейчас я только что получил ее, чтобы она перестала отбрасывать пакеты, и я волнуюсь о том, что вновь вводится. надеялся, что есть какой-то способ перечислить свойства без потери производительности отражения

Goku 04.09.2018 18:20

Вы можете использовать отражение, чтобы получить список всех свойств. Затем вы можете использовать Испускают или Деревья выражений. Таким образом, производительность будет достигнута только при первом запуске.

user310988 04.09.2018 18:23

Если вы не хотите, чтобы производительность повышалась, не просите обдумывать, а расскажите нам, чего вы на самом деле пытаетесь достичь, потому что, безусловно, есть лучший подход. Например, почему бы вам не хранить эти целые числа в одном List<int>? Тогда это было просто: return String.Concat(intList);. Я не понимаю, что вы имеете в виду под «циклом во время компиляции».

Tim Schmelter 04.09.2018 18:30

@TimSchmelter Я, честно говоря, не подумал о том, что вы предложили (отличная идея), и подумал, что размышления - это то, с чем я собираюсь застрять. Думаю, когда значение инициализируется, самое время сохранить их в списке?

Goku 04.09.2018 19:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
216
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Думаю, здесь вам поможет только рефлексия. Что вы можете сделать, так это ввести словарь, где ключи будут типами, а значения будут результатами конкатенации строк. Словарь будет использоваться в вашем приложении как одноэлементный. Таким образом, вы будете вычислять свою строку только один раз для каждого типа, что почти полностью устраняет потерю производительности.

Если вы хотите, чтобы это выполнялось каждый раз при компиляции, а затем не во время выполнения, я бы создал метод, использующий отражение, которое никогда не вызывается во время выполнения. Затем у вас может быть второе консольное приложение, единственная цель которого - запускать этот метод и записывать строку в текстовый файл или что-то в этом роде. В свойствах проекта (вашего основного проекта) вы можете выполнять командную строку (например, запускать консольное приложение).

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

Ответ принят как подходящий

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

Visual Studio поддерживает генерацию кода во время компиляции (или, если быть точнее: во время сохранения) через Шаблоны T4, т.е. вы можете сделать что-то вроде этого:

<#@ template debug = "false" hostspecific = "false" language = "C#" #>
<#@ output extension = ".cs" #>

class MyClass
{
    <# var properties = new string [] {"int1", "int2", "int3", ...}; #>

    <# foreach (string property in properties) { #>
        private int <#= propertyName #>;
    <# } #>

    public string getAllPropertiesAsString()
    {
        return ""
        <# foreach (string property in properties) { #>
            + <#= propertyName #>;
        <# } #>
    }       
}

Обратите внимание, что вам нужно будет установить рабочую нагрузку «Разработка расширений Visual Studio» во время установки Visual Studio 2017.

Другие вопросы по теме