首页 > C# > 在c#中,我可以添加一个扩展属性来调用它将返回吗?

在c#中,我可以添加一个扩展属性来调用它将返回吗?

上一篇 下一篇

C# 是否有扩展属性?

例如,我可以添加一个扩展属性来调用它将返回吗?DateTimeFormatInfoShortDateLongTimeFormatShortDatePattern + " " + LongTimePattern

分割线

网友回答:

不,它们在 C# 3.0 中不存在,也不会在 4.0 中添加。它位于 C# 的功能需求列表中,因此可能会在将来添加它。

此时,您能做的最好的事情就是 GetXXX 样式扩展方法。

分割线

网友回答:

目前,Roslyn 编译器仍然不支持开箱即用……

到目前为止,扩展属性还不够有价值,无法包含在以前版本的 C# 标准中。各种 C# 版本(也许是所有版本?)都将其视为提案冠军,但它尚未发布,最重要的是因为即使已经有一个实现,他们也希望使其正确。

但也许…有一天。。。

2022 年更新:

这些功能似乎仍在讨论中

此外,您可以使用解决方法

如本文所述,您可以使用该功能在运行时将属性附加到对象实例。但是,它不使用标准属性的语法。
它与仅仅语法糖有点不同,增加了定义扩展属性的可能性,例如
作为扩展方法
的别名,因为它将数据存储到类中。
TypeDescriptorstring Data(this MyClass instance)string GetData(this MyClass instance)

我希望 C# 将很快提供一个功能齐全的扩展所有内容(属性和字段),但是在这一点上,只有时间会证明一切。

并随时做出贡献,因为明天的软件将来自社区。

后处理方法

如果允许这样做,您还可以在使用PostSharpMono.Cecil(或类似的代码/ IL重写工具)等工具进行编译后,在程序集中的类上动态添加属性。

但是,正如开发人员在上面的讨论中所解释的那样,重写代码不会让编译器知道您的意图,
因此它可能无法优化生成的代码。作为语言功能,预计结果会更好。

一点历史

C# 7 工作列表中有一个扩展成员项,因此我认为它在不久的将来可能会得到支持。扩展属性的当前状态可以在 Github 上的相关项下找到。

然而,还有一个更有前途的主题,那就是“扩展一切”,特别关注属性和静态类甚至字段。

更新时间:2016 年 <> 月

随着dotnet团队发布了C# 7.0中的新功能以及Mads Torgensen的评论:

扩展属性:我们有一个(非常出色!)实习生在夏天将它们
作为实验实现,以及其他类型的扩展
成员。我们仍然对此感兴趣,但这是一个很大的变化,我们需要
确信这是值得的。

似乎扩展属性和其他成员仍然是包含在 Roslyn 未来版本中的良好候选者,但可能不是 7.0 版本。

更新时间:2017 年 <> 月

扩展成员已作为扩展所有问题的副本而关闭,该问题也已关闭。
主要讨论实际上是广义上的类型扩展性。
该功能现在在此处作为提案进行跟踪,并已从 7.0 里程碑中删除。

更新:2017 年 8 月 – C# 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 播客中所述,扩展不会有任何状态(因此它无法将私有实例成员添加到类中),这意味着您将无法添加链接到实例的私有实例数据。为此调用的原因是这意味着管理内部字典,并且可能很困难(内存管理等)。
为此,您仍然可以使用前面描述的 / 技术,并使用属性扩展将其隐藏在一个不错的属性下。
TypeDescriptorConditionalWeakTable

语法仍可能发生变化,因为暗示了这个问题。例如,可以替换为某些可能感觉更自然且与 Java 相关的更少。extendsfor

2018 年 <> 月更新 – 角色、扩展和静态接口成员

扩展所有内容都没有进入 C# 8.0,因为一些缺点被解释为这个 GitHub 票证的结尾。因此,进行了改进设计的探索。在这里,Mads Torgensen解释了什么是角色和扩展以及它们有何不同:

角色允许在给定
类型的特定值上实现接口。扩展允许在特定代码区域内对
给定类型的所有值实现接口。

在两个用例中,可以从先前提案的拆分中看到。扩展的新语法如下所示:

public extension ULongEnumerable of ulong
{
    public IEnumerator<byte> GetEnumerator()
    {
        for (int i = sizeof(ulong); i > 0; i--)
        {
            yield return unchecked((byte)(this >> (i-1)*8));
        }
    }
}

然后,您将能够执行此操作:

foreach (byte b in 0x_3A_9E_F1_C5_DA_F7_30_16ul)
{
    WriteLine($"{e.Current:X}");
}

对于静态接口

public interface IMonoid<T> where T : IMonoid<T>
{
    static T operator +(T t1, T t2);
    static T Zero { get; }
}

在 上添加扩展属性,并将 视为:intintIMonoid<int>

public extension IntMonoid of int : IMonoid<int>
{
    public static int Zero => 0;
}

分割线

网友回答:

不,它们不存在。

我知道 C# 团队曾经考虑过它们(或者至少 Eric Lippert 是)——以及扩展构造函数和运算符(这些可能需要一段时间才能让你明白,但很酷……但是,我还没有看到任何证据表明它们将成为 C# 4 的一部分。


编辑:它们没有出现在C# 5中,截至2014年6月,它看起来也不会出现在C#<>中。

Eric Lippert,微软C#编译器团队的首席开发人员,直到2012年2009月,在<>年<>月的博客中谈到了这一点:

  • 为什么没有扩展属性?– 编程中的精彩冒险

模板简介:该模板名称为【在c#中,我可以添加一个扩展属性来调用它将返回吗?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 238次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-27
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
响应式 微信公众平台 微信文章 微信素材 企业网站 微信图片 自适应 html5 微信模板 单页式简历模板
您可能会喜欢的其他模板