Arhn - архитектура программирования

Как объявить экземпляр, тип которого определяется пользователем в C#

Просто мой вопрос касается определения типа экземпляра во время выполнения, и этот тип определяется пользователем. Что-то похожее на это:

Type instance1;

Во время выполнения пользователь выберет, например, «int», тогда будет,

int instance1;

Какие-либо предложения?? эффективен ли здесь downcasting?

01.05.2010

  • Вау, как-то ужасно нехорошо пахнет. Вы пишете приложение, пользователь которого должен знать его код и указывать, какие типы использовать? Что Ты пытаешься сделать, если я могу спросить? 01.05.2010
  • Немного больше информации о том, что вы хотите архивировать, было бы очень полезно. Откуда берется пользовательский тип? Выбрал ли конечный пользователь его, скажем, из раскрывающегося списка в графическом интерфейсе? 01.05.2010
  • @Maciej: точно. Вот почему я предложил дженерики. Поскольку C# — это язык со статической типизацией, вы также должны писать код таким же образом. Ключевое слово dynamic может быть неправильным подходом к решению проблем на строго типизированном языке (люди писали отличные программы до C#4 и dynamic :) ). Возможно, Шаза должен использовать рефлектор, если тип действительно определен _end_user, но он ничего конкретного не сказал. 01.05.2010
  • Извините, что я недостаточно ясен, я работаю над приложением, которое разработчик может использовать для создания рекурсивных методов, и мне нужен ответ на предыдущий вопрос, потому что я создаю метод с помощью некоторых входных данных, которые дает разработчик меня, поэтому один из этих входов должен быть выходом метода, который можно выбрать в раскрывающемся списке. 01.05.2010
  • Извините, я до сих пор не могу понять, как вы это себе представляли. Как устроен этот метод? Может быть, вам лучше использовать интерпретатор какого-либо динамического языка сценариев (python/ruby/vbscript/javascript), чтобы пользователь мог написать свой рекурсивный метод со своим собственным кодом? Просто предложение... 01.05.2010
  • Я прошу вас обо всем этом, потому что нет способа сделать именно то, что вы описали в своем вопросе, на С#. Но есть несколько способов выразить одно и то же (рефлектор/общие/dynamic ключевое слово/object, приведенное к некоторому типу). Я просто не уверен, какой из этих методов лучше всего подходит для вашего приложения и в итоге дает чистый и выразительный код. Это должно быть целью, верно? 01.05.2010
  • Хорошо, я все еще работаю над этим, я отвечу, как только разберусь. 04.05.2010

Ответы:


1

То, что вы ищете, это дженерики. Прочитайте введение здесь.

Например, вы должны объявить класс, в котором вы хотите, чтобы этот пользовательский тип был, например:

class MyClass<T>
{
    private T instance1 = default(T);

    public MyClass(T initalvalue)
    {
        instance1 = initalvalue;
    }

    //... some more code
}
01.05.2010
  • Боюсь, что дженерики - это не то, что ищет ОП. Шаза говорит о конечном пользователе, использующем работающее приложение, а не о программисте, который использует свой код. Тип должен быть выбран во время выполнения 01.05.2010
  • @Maciej: это всего лишь предположение, пока Шаза не говорит, что он действительно хочет делать. 01.05.2010
  • Я прокомментировал основной пост, над чем я работаю, и, кстати, я она :) 01.05.2010
  • @Shaza: Прости за это. Не слышал твоего имени раньше. 01.05.2010

  • 2

    Не объясняя более подробно, чего вы хотите достичь, вы можете использовать общий method*, вы можете использовать ключевое слово dynamic C# 4 или вы можете использовать отражение для создания экземпляров данного типа.

    *Универсальный метод будет работать хорошо, если тип может быть известен во время компиляции или если это один из конечного набора типов, и вы выберете тип, который был назван во время компиляции. (т. е. пользователь скажет одно из int, char или double, и вы соответственно будете использовать правильный универсальный вариант). Если это полностью неопределимо, вам все равно нужно будет использовать отражение для создания экземпляра универсального с типом, заданным во время выполнения.

    01.05.2010
  • +1. Да, я думал о том, чтобы решить эту проблему с помощью дженериков, если, как вы сказали, существует определенный набор типов, известных во время компиляции. Я не сторонник использования dynamic, если вы не взаимодействуете с динамическим языком. Я думаю, что довольно уродливо превращать С# во что-то, чем он не является: динамический язык. 01.05.2010

  • 3

    динамическое ключевое слово в C# 4.0

    01.05.2010

    4

    Я полагаю, это то, что вы ищете:

    Type myType = typeof(int);
    int value = Activatior.CreateInstance(myType);
    

    В .NET 4 ключевое слово dynamic, пожалуй, более эффективно и удобно.

    01.05.2010
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..