您认为通用属性在.NET中会有用吗?

我不是在讨论声明具有generics参数类型的属性或字段的generics类。 我在谈论可以应用于generics和非generics类的generics属性。

我不是在说这个:

public class Base { public T BaseProperty { get; set; } } 

我在说这个:

 public class Base { public T BaseProperty { get { // Insert magic } set { // Insert magic } } } 

或这个:

 public class Base { public T BaseProperty { get { // Insert magic } set { // Insert magic } } public U OtherBaseProperty { get; set; } } 

用法将是这样的:

 var b = new Base(); b.BaseProperty = 42; int i = b.BaseProperty; b.BaseProperty = "Hi"; string s = b.BaseProperty; 

或者对于第二个例子:

 var b = new Base(); b.BaseProperty = 42; int i = b.BaseProperty; b.OtherBaseProperty = "Hi"; string s = b.OtherBaseProperty; 

// Insert Magic指的是处理对类型参数具有不同类型的generics属性getter或setter的每次调用。

例如:

 b.BaseProperty = 42; 

需要以不同的方式处理:

 b.BaseProperty = "Hi"; 

我会设想对于每个类型T,如果在调用setter之前调用getter,则返回default(T)。 当调用setter时,每个类型T都存储一个值,这样当随后调用getter时,将返回为该类型设置的先前值。

请注意,封面下的属性只是方法。

你认为这会有用吗?

我曾经有过几次我希望能够做到这一点的能力,是的。

但是,所涉及的语法会非常难看,并且它很少有用,我认为我更喜欢把它搞砸并使用generics方法。

不。

没有杀手锏,没有。 如果需要,您可以使用一对通用方法实现相同的function。

没有。

通用方法是有意义的,因为它们体现了一些(通用)操作,可以合理地应用于不同类型。

但属性仅作为具有明确内容的唯一命名值才有意义。 像你建议的那样,“通用属性”实际上只相当于具有不同签名和不同内容的同名属性。

这是一个例子,它对我来说很方便,如果可能的话。

 var settings = new Settings(); int timeout = settings["CacheInMinutes"]; 

设置加载配置变量的XML文件。

那,相比:

 var settings = new Settings(); int timeout = int.Parse(settings["CacheInMinutes"]); 

真的没什么区别,但是,嘿,我仍然会更喜欢通用索引器。

好吧,我的情况需要非generics类中的generics属性。

示例您有IComponent类要为其父IContainer提供属性Parent ,因为该组件可以属于任何容器类型。 所以你需要提供通用属性而不是generics方法

 Component c = new Component(); Container p = new Container(); p.Add(c); 

然后使用generics属性访问其父级(现在不适用)

 c.Parent.ContainerProperty; c.Parent.ContainerMethod(); 

而是使用像verbose这样的详细方法

 c.Parent().ContainerProperty; c.Parent().ContainerMethod(); 

好吧,在这种情况下,通用属性更美观,更有意义,因为您不需要输入任何参数。

如果由于一些奇怪的原因你决定你想要它,你可以用方法来伪装它:

 public class Thing { Dictionary xDict = new Dictionary(); public void set_X(T x) { xDict[typeof(T)] = x; } public T get_X() { return (T)xDict[typeof(T)]; } } 

但是,为什么你想要的却完全不同。 从你想做的事情开始,通常比你想做的事情更有意义。