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

时间:2009-03-16 23:21:14

标签: c# .net generics c#-3.0 properties

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

我不是在谈论这个:

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时,将返回为该类型设置的先前值。

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

您认为这会有用吗?

7 个答案:

答案 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)];
    }
}

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