我之前已经考虑过这个问题,在阅读this问题时又想到了这一点。
C#的未来版本中是否有“扩展属性”的计划?
在我看来,他们可能会非常直接地使用更多的“编译器魔术”来实现。例如,在扩展方法名称上使用 get _ 和 set _ 前缀会将该方法转换为扩展属性:
public class Foo
{
public string Text { get; set; }
}
public static class FooExtensions
{
public static string get_Name(this Foo foo)
{
return foo.Text;
}
public static void set_Name(this Foo foo, string value)
{
foo.Text = value;
}
}
是否有任何技术限制可以防止这种情况发生?这会在幕后产生太多东西吗?不重要的是值得努力吗?
答案 0 :(得分:7)
功能请求的官方网站是http://connect.microsoft.com/VisualStudio。
已经有扩展属性here的请求。
微软在2008年7月29日的回答包括以下内容:
扩展属性很常见 请求,我们实际上已经相当远了 具有下一版本的设计 语言,但最终不得不 因各种原因而废弃它 困难。它还在我们身上 雷达。
答案 1 :(得分:6)
一般来说,我认为这会鼓励不良做法。属性应该代表有关对象的某种状态,而方法应该代表工作单元。但是许多开发人员倾向于将计算密集型或相对长时间运行的代码放在getter和setter中,在那里它们更适合作为方法。扩展对象不与从它派生相同。如果您需要添加属性,从哲学角度来看,您正在谈论需要向对象添加有状态信息。这应该通过从类派生来完成。
答案 2 :(得分:3)
虽然我不认为你提出的建议是个好主意,但你可以在C#4中使用即将推出的dynamic
类型获得相同的内容。计划的部分内容是允许新属性以及在运行时添加到现有对象和类型的方法。一个区别是您不会对扩展属性进行编译时检查。
答案 3 :(得分:2)
关于这种伎俩可能有些话要说。
只需查看WPF中的附加属性即可。它们确实为声明性行为附件提供了巨大的力量。但我不确定在声明性背景之外会是什么样的......
答案 4 :(得分:0)
我不确定这是怎么回事。扩展必须是静态的,因此属性本身必须是静态的。用于支持这些属性的任何方法也都是静态的。但是,期望您计划使用它们,期望它们与this
关键字指示的实例相关联,而不是类型本身。
答案 5 :(得分:0)
今天可以通过继承获得“扩展属性”。添加这样的野兽会鼓励糟糕的oop做法,并且通常比它的价值更麻烦。