.jpg)
C# 是否有扩展属性?
例如,我可以添加一个扩展属性来调用它将返回吗?DateTimeFormatInfoShortDateLongTimeFormatShortDatePattern + " " + LongTimePattern

网友回答:
不,它们在 C# 3.0 中不存在,也不会在 4.0 中添加。它位于 C# 的功能需求列表中,因此可能会在将来添加它。
此时,您能做的最好的事情就是 GetXXX 样式扩展方法。

网友回答:
到目前为止,扩展属性还不够有价值,无法包含在以前版本的 C# 标准中。各种 C# 版本(也许是所有版本?)都将其视为提案冠军,但它尚未发布,最重要的是因为即使已经有一个实现,他们也希望使其正确。
2022 年更新:
这些功能似乎仍在讨论中。
如本文所述,您可以使用该功能在运行时将属性附加到对象实例。但是,它不使用标准属性的语法。
它与仅仅语法糖有点不同,增加了定义扩展属性的可能性,例如
作为扩展方法
的别名,因为它将数据存储到类中。TypeDescriptorstring Data(this MyClass instance)string GetData(this MyClass instance)
我希望 C# 将很快提供一个功能齐全的扩展所有内容(属性和字段),但是在这一点上,只有时间会证明一切。
并随时做出贡献,因为明天的软件将来自社区。
如果允许这样做,您还可以在使用PostSharp,Mono.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#】栏目查找您需要的精美模板。