您认为通用属性在.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)]; } }
但是,为什么你想要的却完全不同。 从你想做的事情开始,通常比你想做的事情更有意义。