Есть ли в C # свойства расширения?
Например, я могу добавить свойство extension к DateTimeFormatInfo
вызываемому объекту, ShortDateLongTimeFormat
который будет возвращать ShortDatePattern + " " + LongTimePattern
?
Есть ли в C # свойства расширения?
Например, я могу добавить свойство extension к DateTimeFormatInfo
вызываемому объекту, ShortDateLongTimeFormat
который будет возвращать ShortDatePattern + " " + LongTimePattern
?
?
enum
которые могут иметь свойства и методы. В C #enum
не может быть свойств или методов, но вы можете создавать методы расширения для них. Этот вопрос был полезен для меня и не должен быть закрыт.Ответы:
На данный момент это все еще не поддерживается из коробки компилятором Roslyn ...
До сих пор свойства расширения не рассматривались как достаточно ценные для включения в предыдущие версии стандарта C #. C # 7 и C # 8.0 считают это чемпионом предложения, но оно еще не было выпущено, прежде всего потому, что, даже если уже есть реализация, они хотят сделать это с самого начала.
Но это будет ...
В рабочем списке C # 7 есть элемент расширения, поэтому он может быть поддержан в ближайшем будущем. Текущий статус свойства extension можно найти на Github под соответствующим элементом .
Тем не менее, есть еще более многообещающая тема, которая заключается в том, чтобы «расширить все», уделяя особое внимание свойствам, статическим классам или даже полям.
Кроме того, вы можете использовать обходной путь
Как указано в этой статье , вы можете использовать
TypeDescriptor
возможность прикрепить атрибут к экземпляру объекта во время выполнения. Однако он не использует синтаксис стандартных свойств.Это немного отличается от простого синтаксического сахара, добавляющего возможность определять расширенное свойство, например,
string Data(this MyClass instance)
в качестве псевдонима для метода расширения, такstring GetData(this MyClass instance)
как оно хранит данные в классе.Я надеюсь, что C # 7 обеспечит полнофункциональное расширение всего (свойств и полей), однако на данный момент только время покажет.
И не стесняйтесь вносить свой вклад, поскольку программное обеспечение завтрашнего дня придет от сообщества.
Обновление: август 2016
Как команда dotnet опубликовала, что нового в C # 7.0 и из комментария Мадса Торгенсена :
Кажется, что свойства расширения и другие члены все еще являются хорошими кандидатами для включения в будущий выпуск Roslyn, но, возможно, не 7.0.
Обновление: май 2017
Члены расширения были закрыты как дубликат вопроса расширения, который тоже закрыт. Основное обсуждение было на самом деле о расширяемости типов в широком смысле. Эта функция теперь отслеживается здесь как предложение и удалена из этапа 7.0 .
Обновление: август 2017 г. - C # 8.0 предлагаемая функция
Хотя это все еще остается только предложенной функцией, теперь у нас есть более четкое представление о том, каким будет ее синтаксис. Имейте в виду, что это будет новый синтаксис и для методов расширения:
Подобно частичным классам, но скомпилирован как отдельный класс / тип в другой сборке. Обратите внимание, что вы также сможете добавлять статические члены и операторы таким образом. Как упоминалось в подкасте Mads Torgensen , расширение не будет иметь никакого состояния (поэтому оно не может добавлять частные элементы экземпляра в класс), что означает, что вы не сможете добавить частные данные экземпляра, связанные с экземпляром . Причина, по которой это вызвано, заключается в том, что это подразумевает управление внутренними словарями, и это может быть сложно (управление памятью и т. Д.). Для этого вы все еще можете использовать метод
TypeDescriptor
/ConditionalWeakTable
, описанный ранее, и с расширением свойства скрывает его под хорошим свойством.Синтаксис все еще может быть изменен, поскольку подразумевает эту проблему . Например,
extends
может быть заменено тем,for
что некоторые могут чувствовать себя более естественно и менее связаны с Java.Обновление декабря 2018 года - роли, расширения и статические члены интерфейса
Расширение все не дошло до C # 8.0, из-за некоторых недостатков, объясненных как конец этого билета GitHub . Итак, было проведено исследование для улучшения дизайна. Здесь Мадс Торгенсен объясняет, что такое роли и расширения и чем они отличаются:
Это можно увидеть при разделении предыдущего предложения в двух случаях использования. Новый синтаксис для расширения будет выглядеть так:
тогда вы сможете сделать это:
И для статического интерфейса :
Добавить свойство расширения на
int
и лечить ,int
какIMonoid<int>
:источник
Нет, они не существуют в C # 3.0 и не будут добавлены в 4.0. Он находится в списке желаний для C #, поэтому он может быть добавлен в будущем.
На данный момент лучшее, что вы можете сделать, - это методы расширения стиля GetXXX.
источник
Нет, их не существует.
Я знаю, что команда C # рассматривала их в какой-то момент (или, по крайней мере, Эрик Липперт) - вместе с конструкторами расширений и операторами (это может занять некоторое время, чтобы разобраться, но это круто ...) Однако, у меня нет не видел никаких доказательств того, что они будут частью C # 4.
РЕДАКТИРОВАТЬ: они не появлялись в C # 5, и по состоянию на июль 2014 года, похоже, что он не будет в C # 6.
Эрик Липперт (Eric Lippert) , главный разработчик команды компилятора C # в Microsoft до ноября 2012 года, сообщил об этом в октябре 2009 года:
источник
()
в конце гораздо более читабельно. Я лично знаю, что по крайней мере 90% написанных мной расширений относятся к этим двум типам.FullName
=FirstName + LastName
,ShortName
=FirstName + LastName[0]
. Я хотел бы добавить больше этих свойств, но я не хочу «загрязнять» реальные классы. В этом случае свойство расширения, предназначенное только для чтения, идеально подходит, потому что я могу добавить функциональность, сохранить основной класс в чистоте и по-прежнему предоставлять информацию, которую я хочу предоставить в пользовательском интерфейсе.static implicit operator FileInfo(FileInfoEx fex)
который возвращает мой содержащийся объект FileInfo. Это позволяет мне обрабатывать FileInfoEx так, как если бы он наследовал от FileInfo, даже если этот класс запечатан.Обновление (спасибо @chaost за указание на это обновление):
Источник: раздел комментариев в https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/
Я перестал считать, сколько раз за эти годы я открыл этот вопрос в надежде увидеть, как это будет реализовано.
Ну наконец-то мы все можем порадоваться! Microsoft собирается представить это в своем следующем выпуске C # 8.
Так что вместо этого ...
Мы наконец сможем сделать это так ...
Источник: https://blog.ndepend.com/c-8-0-features-glimpse-future/
источник
Как упоминалось в @Psyonity, вы можете использовать conditionalWeakTable для добавления свойств к существующим объектам. В сочетании с динамическим ExpandoObject вы можете реализовать динамические свойства расширения в несколько строк:
Пример использования в комментариях xml:
источник
Поскольку я недавно нуждался в этом, я посмотрел на источник ответа в:
C # расширить класс, добавив свойства
и создал более динамическую версию:
Вероятно, его можно значительно улучшить (присвоение имен динамическим, а не строковым), в настоящее время я использую это в CF 3.5 вместе с хакерским ConditionalWeakTable ( https://gist.github.com/Jan-WillemdeBruyn/db79dd6fdef7b9845e217958db98c4d4 )
источник