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相关的。

    链接地址: http://www.djcxy.com/p/17445.html

    上一篇: Does C# have extension properties?

    下一篇: Can I add extension methods to an existing static class?