Лучший отвечающий
Новые возможности C#

Вопрос
-
Здравствуйте. Не знаю куда обратиться, поэтому пишу сюда.
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.
- Изменено Ilya TumanovMicrosoft employee, Moderator 28 апреля 2017 г. 22:39
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 2 мая 2017 г. 7:43
28 апреля 2017 г. 16:52Модератор -
Добрый день, Николай.
Для внесения предложений по развитию языка C# есть специальный сайт UserVoice.
- Предложено в качестве ответа Liliya Muray 28 апреля 2017 г. 14:16
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 2 мая 2017 г. 7:43
28 апреля 2017 г. 10:50Отвечающий
Все ответы
-
Добрый день, Николай.
Для внесения предложений по развитию языка C# есть специальный сайт UserVoice.
- Предложено в качестве ответа Liliya Muray 28 апреля 2017 г. 14:16
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 2 мая 2017 г. 7:43
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.
- Изменено Ilya TumanovMicrosoft employee, Moderator 28 апреля 2017 г. 22:39
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 2 мая 2017 г. 7:43
28 апреля 2017 г. 16:52Модератор -
Для начала вам следует хорошенько изучить C# и платформу .NET в целом, после этого вряд ли будут новые предложения. Сама Microsoft последние годы топчется на месте, так как всё что нужно уже давно реализовано.
Сделаем содержимое сообщества лучше, вместе!
3 мая 2017 г. 8:17Модератор -
Ну не все, еще можно много чего полезного сделать.
У меня, например, много вопросов к 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.
3 мая 2017 г. 15:59Модератор