C#有扩展属性吗?
C#有扩展属性吗?
例如,我可以向DateTimeFormatInfo
添加一个名为ShortDateLongTimeFormat
的扩展属性,它将返回ShortDatePattern + " " + LongTimePattern
?
不,它们不存在于C#3.0中,并且不会在4.0中添加。 它位于C#的功能需求列表中,因此它可能会在未来的日期添加。
在这一点上,你可以做的最好的就是GetXXX风格的扩展方法。
不,他们不存在。
我知道C#团队正在考虑他们(或者至少是Eric Lippert) - 以及扩展构造函数和操作符(这些可能需要一段时间才能让你的头部变圆,但很酷......)但是,我避开没有看到任何证据证明他们将成为C#4的一部分。
编辑:他们没有出现在C#5中,截至2014年7月,它看起来并不像C#6中那样。
微软C#编译团队的首席开发人员Eric Lippert于2012年11月在2009年10月发表了博客:
目前它仍不支持Roslyn编译器开箱即用...
到目前为止,扩展属性并没有被视为足以包含在以前版本的C#标准(即5和6)中。
但它会...
C#7工作列表中有一个扩展成员项目,因此它可能在不久的将来得到支持。 扩展属性的当前状态可以在Github的相关项目下找到。
然而,还有一个更有希望的主题是“扩展所有”,尤其是属性和静态类甚至是领域。
此外,您可以使用解决方法
如本文所述,您可以使用TypeDescriptor
功能在运行时将属性附加到对象实例。 但是,它不使用标准属性的语法。
它与语法糖有点不同,增加了定义扩展属性的可能性
string Data(this MyClass instance)
作为扩展方法的别名
string GetData(this MyClass instance)
因为它将数据存储到类中。
我希望C#7能够提供全面的功能扩展(属性和字段),但是在这一点上,只有时间才能说明问题。
随着明天的软件将来自社区,随时做出贡献。
更新:2016年8月
随着dotnet团队发布了C#7.0中的新功能以及来自Mads Torgensen的评论:
扩展属性:我们有一个(辉煌的!)实习生在夏季将其作为实验与其他类型的扩展成员一起实施。 我们仍然对此感兴趣,但这是一个巨大的变化,我们需要确信这是值得的。
似乎扩展属性和其他成员仍然是未来版本中包含的候选人,但可能不是7.0版本。
更新:2017年5月
扩展成员已被关闭,作为扩展所有关闭的问题的副本。 主要的讨论实际上是关于广义上的类型可扩展性。 此功能现在作为提案进行跟踪,并已从7.0里程碑中删除。
更新:2017年8月 - C#8.0提出的功能
虽然它仍然只是一个提议的特征,但我们现在更清楚地了解它的语法。 请记住,这也是扩展方法的新语法:
public interface IEmployee
{
public decimal Salary { get; set; }
}
public class Employee
{
public decimal Salary { get; set; }
}
public extension MyPersonExtension extends Person : IEmployee
{
private static readonly ConditionalWeakTable<Person, Employee> _employees =
new ConditionalWeakTable<Person, Employee>();
public decimal Salary
{
get
{
// `this` is the instance of Person
return _employees.GetOrCreate(this).Salary;
}
set
{
Employee employee = null;
if (!_employees.TryGetValue(this, out employee)
{
employee = _employees.GetOrCreate(this);
}
employee.Salary = value;
}
}
}
IEmployee person = new Person();
var salary = person.Salary;
类似于部分类,但在不同的程序集中编译为单独的类/类型。 注意你也可以用这种方式添加静态成员和操作符。 正如Mads Torgensen podcast所提到的那样, 扩展将没有任何状态(所以它不能将私有实例成员添加到类中),这意味着您将无法添加链接到该实例的私有实例数据 。 为此所援引的原因是这意味着管理内部字典,这可能很困难(内存管理等)。 为此,您仍然可以使用前面描述的TypeDescriptor
/ ConditionalWeakTable
技术和属性扩展,将其隐藏在一个不错的属性下。
由于存在这个问题,语法仍然可能发生变化。 例如, extends
可以被替换for
一些可能感觉更自然和更少的Java相关的。
上一篇: Does C# have extension properties?
下一篇: Can I add extension methods to an existing static class?