我不是在谈论声明具有泛型参数类型的属性或字段的泛型类。我在谈论可以应用于泛型和非泛型类的泛型属性。
我不是在谈论这个:
public class Base<T>
{
public T BaseProperty { get; set; }
}
我在说这个:
public class Base
{
public T BaseProperty<T>
{
get
{
// Insert magic
}
set
{
// Insert magic
}
}
}
或者这个:
public class Base<U>
{
public T BaseProperty<T>
{
get
{
// Insert magic
}
set
{
// Insert magic
}
}
public U OtherBaseProperty { get; set; }
}
用法如下:
var b = new Base();
b.BaseProperty<int> = 42;
int i = b.BaseProperty<int>;
b.BaseProperty<string> = "Hi";
string s = b.BaseProperty<string>;
或者第二个例子:
var b = new Base<string>();
b.BaseProperty<int> = 42;
int i = b.BaseProperty<int>;
b.OtherBaseProperty = "Hi";
string s = b.OtherBaseProperty;
// Insert Magic指的是处理对类型参数具有不同类型的泛型属性getter或setter的每次调用。
例如:
b.BaseProperty<int> = 42;
需要以不同方式处理:
b.BaseProperty<string> = "Hi";
我会设想对于每个类型T,如果在调用setter之前调用getter,则返回default(T)。 当调用setter时,每个类型T都存储一个值,这样当随后调用getter时,将返回为该类型设置的先前值。
请注意,封面下的属性只是方法。
您认为这会有用吗?
答案 0 :(得分:10)
我曾经有过几次我希望能够做到这一点的能力,是的。
然而,所涉及的语法会非常难看,并且它很少有用,我认为我更喜欢把它搞砸并使用泛型方法。
答案 1 :(得分:1)
不。
答案 2 :(得分:1)
没有杀手级用例,没有。如果需要,您可以使用一对通用方法实现相同的功能。
答案 3 :(得分:1)
没有
通用方法很有意义,因为它们体现了一些可以合理应用于不同类型的(通用)操作。
但属性仅作为具有明确内容的唯一命名值才有意义。像你建议的那样,“通用属性”实际上只相当于具有不同签名和不同内容的同名属性。
答案 4 :(得分:1)
这是一个例子,如果可能的话,对我来说会很方便。
var settings = new Settings();
int timeout = settings<int>["CacheInMinutes"];
Where Settings加载配置变量的XML文件。
与...相比:
var settings = new Settings();
int timeout = int.Parse(settings["CacheInMinutes"]);
真的没什么区别,但是嘿,我仍然会更喜欢通用索引器。
答案 5 :(得分:1)
好吧,我的情况是非泛型类中需要泛型属性。
示例您有IComponent
类想要为其父IContainer
提供属性Parent
,因为该组件可以属于任何容器类型。所以你需要提供通用属性而不是通用方法
Component c = new Component();
Container p = new Container();
p.Add(c);
然后使用通用属性访问其父级(现在不适用)
c.Parent.ContainerProperty;
c.Parent.ContainerMethod();
而是使用像
这样的详细方法c.Parent().ContainerProperty;
c.Parent().ContainerMethod();
嗯,在这种情况下,泛型属性更美观,更有意义,因为您不需要输入任何参数。
答案 6 :(得分:0)
如果出于某种奇怪的原因你决定要它,你可以用方法伪装它:
public class Thing
{
Dictionary<Type, object> xDict = new Dictionary<Type,object>();
public void set_X<T>(T x)
{
xDict[typeof(T)] = x;
}
public T get_X<T>()
{
return (T)xDict[typeof(T)];
}
}
但是,为什么你想要的却完全不同。从你想要做的事情开始,通常比你想做的事情更有意义。