Does C# have extension properties?
For example, can I add an extension property to DateTimeFormatInfo
called ShortDateLongTimeFormat
which would return ShortDatePattern + " " + LongTimePattern
?
cextension-methodsproperties
Does C# have extension properties?
For example, can I add an extension property to DateTimeFormatInfo
called ShortDateLongTimeFormat
which would return ShortDatePattern + " " + LongTimePattern
?
Best Answer
For the moment it is still not supported out of the box by Roslyn compiler ...
Until now, the extension properties were not seen as valuable enough to be included in the previous versions of C# standard. C# 7 and C# 8.0 have seen this as proposal champion but it wasn't released yet, most of all because even if there is already an implementation, they want to make it right from the start.
But it will ...
There is an extension members item in the C# 7 work list so it may be supported in the near future. The current status of extension property can be found on Github under the related item.
However, there is an even more promising topic which is the "extend everything" with a focus on especially properties and static classes or even fields.
Moreover you can use a workaround
As specified in this article, you can use the
TypeDescriptor
capability to attach an attribute to an object instance at runtime. However, it is not using the syntax of the standard properties.It's a little bit different from just syntactic sugar adding a possibility to define an extended property like
string Data(this MyClass instance)
as an alias for extension methodstring GetData(this MyClass instance)
as it stores data into the class.I hope that C#7 will provide a full featured extension everything (properties and fields), however on that point, only time will tell.
And feel free to contribute as the software of tomorrow will come from the community.
Update: August 2016
As dotnet team published what's new in C# 7.0 and from a comment of Mads Torgensen:
It seems that extension properties and other members, are still good candidates to be included in a future release of Roslyn, but maybe not the 7.0 one.
Update: May 2017
The extension members has been closed as duplicate of extension everything issue which is closed too. The main discussion was in fact about Type extensibility in a broad sense. The feature is now tracked here as a proposal and has been removed from 7.0 milestone.
Update: August, 2017 - C# 8.0 proposed feature
While it still remains only a proposed feature, we have now a clearer view of what would be its syntax. Keep in mind that this will be the new syntax for extension methods as well:
Similar to partial classes, but compiled as a separate class/type in a different assembly. Note you will also be able to add static members and operators this way. As mentioned in Mads Torgensen podcast, the extension won't have any state (so it cannot add private instance members to the class) which means you won't be able to add private instance data linked to the instance. The reason invoked for that is it would imply to manage internally dictionaries and it could be difficult (memory management, etc...). For this, you can still use the
TypeDescriptor
/ConditionalWeakTable
technique described earlier and with the property extension, hides it under a nice property.Syntax is still subject to change as implies this issue. For example,
extends
could be replaced byfor
which some may feel more natural and less java related.Update December 2018 - Roles, Extensions and static interface members
Extension everything didn't make it to C# 8.0, because of some of drawbacks explained as the end of this GitHub ticket. So, there was an exploration to improve the design. Here, Mads Torgensen explains what are roles and extensions and how they differs:
It can be seen at a split of previous proposal in two use cases. The new syntax for extension would be like this:
then you would be able to do this:
And for a static interface:
Add an extension property on
int
and treat theint
asIMonoid<int>
: