Nano Hash - криптовалюты, майнинг, программирование

C# Передача массивов приведения получателю массива массива динамического типа

Итак, в какой-то момент у меня что-то работало, но весь мой старый тестовый код был случайно удален, и я не могу снова заставить его работать... Помогите!

У меня есть функция в библиотеке:

public int SetData( dynamic[] p_a )
    {
    int successful_count = 0;
    int _save_selected_row;

    //It goes on...
    }

Пользователи будут вызывать эту функцию, и мне показалось, что я помню, как она вызывалась так:

    struct MyStruct
        {
        public String Name;
        public String Home_Address;
        }
    MyStruct[] UseArray = new MyStruct[2];



    private void button1_Click(object sender, EventArgs e)
        {
        UseArray[0].Name = "Override name 1";
        UseArray[0].Home_Address = "Override address 1";
        UseArray[1].Name = "Override name 2";
        UseArray[1].Home_Address = "Override address 2";

        ncflsDisplay1.SetData( UseArray );
        }

Но я получаю сообщение об ошибке «Не удается преобразовать MyStruct[] в dynamic[]».

Та же ошибка для

ncflsDisplay1.SetData( (dynamic[]) UseArray );

Я знаю, что месяц назад у меня работало что-то подобное, но при очистке кода мои тестовые программы были удалены.

Любая идея, что вызов, который должен будет сделать пользователь, должен выглядеть как вызов «SetData» с массивом любого типа, который у них есть?

Обновление: у меня получилось с этим чудовищем, но я знаю, что мне не нужно было делать это раньше...

 UseArray.Cast<dynamic>().ToArray()

В какой-то момент код был намного чище — например, простой вызов с использованием UseArray, но сейчас он не работает.

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

События настигли первое решение. У нас есть новое решение!

Изменены параметры функции отображения на

 public int SetData<T>( T[] p_a )

который позволяет звонить пользователю

ncflsDisplay1.SetData( UseArray );
10.06.2019

  • Вы не должны использовать dynamic для чего-то подобного. Используйте интерфейсы для выполнения операции с любым количеством различных типов с помощью этой операции. MyStruct также не должно быть структурой, учитывая, что это изменяемый тип. Это должен быть класс или, как минимум, неизменяемый (но даже в этом случае у него нет веской причины быть struct). 21.06.2019
  • Ну, насколько я знаю, это не изменчиво. У пользователя есть некоторое (очень небольшое) количество данных, сгруппированных логически, которые я должен отобразить. У них есть свои структуры, они мне их кидают. Я не думаю, что мы заинтересованы в создании классов для каждой маленькой линии, отображаемой в сетке, поэтому ссылка (дубликат) на эту другую, которую вы указали, не применяется. Как и ваше предложение превратить одно или два поля данных в полноценный класс. Я имею в виду, я понимаю, откуда вы исходите, и если бы это было больше и сложнее, я бы согласился, но это не так. 24.06.2019
  • Да, он изменчив. Вы можете не изменять его (в этом случае тем больше причин изменить тип, чтобы он был неизменяемым), но его можно изменить. Почему вы против использования класса здесь? Почему это может быть проблемой? Дубликат абсолютно отвечает на ваш вопрос. Он точно объясняет, почему это не работает и что вы можете с этим поделать. Остальное зависит от тебя. 24.06.2019
  • Для справки, стоимость использования dynamic заключается, прежде всего, в том, что объект должен быть классом, а не типом значения, из-за самой его природы, а также на много порядков дороже. , кроме того, что это крайне небезопасно и совсем не соответствует ситуации. 24.06.2019
  • Что ж, возможно, мы вернемся к нашим размышлениям о том, чего мы пытаемся достичь. Нашей целью было просто передать небольшие блоки логически сгруппированных данных из массива элементов в дисплей. Мы думали использовать небольшие, локально определенные структуры, а не создавать и заполнять классы/объекты. Версия со списком работает хорошо и работает быстро — нам нужна версия с массивом, так как именно так данные фактически хранятся выше по течению. Спасибо за ваше предложение, и я обновлю этот пост, если мы передумаем. 24.06.2019

Ответы:


1

Если вам действительно нужно использовать эту функцию и вы не можете обновить ее подпись, вы можете попробовать скопировать массив:

MyStruct[] UseArray = new MyStruct[2];

dynamic[] newArr = new dynamic[UseArray.Length];

Array.Copy(UseArray, newArr, UseArray.Length);

SetData(newArr);

В противном случае вы можете изменить его на что-то вроде SetData<T>(T data) или SetData (данные объекта)

10.06.2019

2

Что ж, мы продвигаемся вперед, хотя я знаю, что раньше мне не приходилось этого делать.

UseArray.Cast<dynamic>().ToArray()

Более новое решение: см. конец отредактированного вопроса, но в основном сейчас

public int SetData<T>( T[] p_a )

так что вызов простой

ncflsDisplay1.SetData( UseArray );
14.06.2019
  • На самом деле это: UseArray.Cast‹dynamic›().ToArray(). Я не знаю, почему в ответе нет слова «динамический» - оно там... 21.06.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..