none
Новые возможности C# RRS feed

  • Вопрос

  • Здравствуйте. Не знаю куда обратиться, поэтому пишу сюда.

    C# хорошо развивается как новыми возможностями, так синтаксическим сахаром. Решая различные задачи, я с несколькими сложностями в их реализации в силу того, что C# на это не способен. Поэтому хочу предложить на рассмотрение того, чтобы я хотел видеть в C#:

     1. Создание объекта

    var myType = typeof(myClass);
    var myObject = (myClass)Activator.CreateInstance(myType);

    Хотелось бы использовать название класса как переменную

    var myVariable = myClass;
    var myObject = (myVariable)Activator.CreateInstance(typeof(myVariable));

     2. Вызов расширенной функции для перечисления

    public enum Numbers { One = 1, Two = 2, Three = 3 } public static class ExtentionEnum { public static bool IsContains(this Numbers source, int number) { ... } }

    Numbers.One.IsContains(5); var myVar = Numbers.One; myVar.IsContains(3)

    Хотелось бы использовать от имени перечисления расширенные функции

    public enum Numbers
    {
       One = 1,
       Two = 2,
       Three = 3
    }
    
    public static class ExtentionEnum
    {
       public static bool IsContains(this Numbers source, int number)
       {
         ...
       }
    }
    
    Numbers.IsContains(5); // return false
    
    3.  Мета-классы. Как ОРМ фрайемворки создают классы на основе БД, так же хотелось бы создавать классы динамически

     
    28 апреля 2017 г. 9:45

Ответы

  • 1. Я бы сказал что это не может работать. Перепутана информация о типах во время компиляции и исполнения. Неизвестные при компиляции типы всегда будут в переменных типа object. Можно так же использовать dynamic.

    2. В зависимости от того что вы хотите можно использовать либо Enum.IsDefined() либо Enum.HasFlag(). Первый проверяет есть ли значение в типе Enum, второй проверяет установлен ли флаг в конкретном значении. Судя по использованию вы хотите именно первое. Опять же, перепутав информацию о типах во время компиляции и исполнения, отсюда и разногласия в вызове (где используется имя типа при компиляции) и в объявлении расширения (где передается конкретное значение).

    Enum.IsDefined(typeof(Numbers), 5) 

    3. Для этого есть Reflection.Emit и основанные на нем сервисы. 

    #2 и #3 работают во всех .Net языках.


    This posting is provided "AS IS" with no warranties, and confers no rights.


    28 апреля 2017 г. 16:52
    Модератор
  • Добрый день, Николай.

    Для внесения предложений по развитию языка C# есть специальный сайт UserVoice.

    28 апреля 2017 г. 10:50
    Отвечающий

Все ответы

  • Добрый день, Николай.

    Для внесения предложений по развитию языка C# есть специальный сайт UserVoice.

    28 апреля 2017 г. 10:50
    Отвечающий
  • 1. Я бы сказал что это не может работать. Перепутана информация о типах во время компиляции и исполнения. Неизвестные при компиляции типы всегда будут в переменных типа object. Можно так же использовать dynamic.

    2. В зависимости от того что вы хотите можно использовать либо Enum.IsDefined() либо Enum.HasFlag(). Первый проверяет есть ли значение в типе Enum, второй проверяет установлен ли флаг в конкретном значении. Судя по использованию вы хотите именно первое. Опять же, перепутав информацию о типах во время компиляции и исполнения, отсюда и разногласия в вызове (где используется имя типа при компиляции) и в объявлении расширения (где передается конкретное значение).

    Enum.IsDefined(typeof(Numbers), 5) 

    3. Для этого есть Reflection.Emit и основанные на нем сервисы. 

    #2 и #3 работают во всех .Net языках.


    This posting is provided "AS IS" with no warranties, and confers no rights.


    28 апреля 2017 г. 16:52
    Модератор
  • Для начала вам следует хорошенько изучить C# и платформу .NET в целом, после этого вряд ли будут новые предложения. Сама Microsoft последние годы топчется на месте, так как всё что нужно уже давно реализовано.

    Сделаем содержимое сообщества лучше, вместе!

    Модератор
  • Ну не все, еще можно много чего полезного сделать.

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

    Не повредит и внедрение деклараций, на манер Code Contracts только без кода, вроде:

    void foo ([NotNull] goo bar)

    Что будет эквивалентно традиционному коду:

    if (bar == null) throw new ArgumentNullException(nameof(bar))


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор