【问题标题】:generics or object-based?泛型还是基于对象?
【发布时间】:2012-04-02 17:51:29
【问题描述】:

我必须在基于对象和泛型之间做出决定。

我有一个数据结构,它可以是 int、string 或 bool。稍后我需要一个项目列表,但我不确定是否应该将项目设为通用或将项目中的值作为对象。

public class Item<T>
{
    private T value = default(T);

    public Item(T value)
    {
        this.value = value;
    }

    public T Value
    {
        get { return this.value; }
        set { this.value = value; }
    }
}

public class Item
{
    private Object value = null;

    public Item(Object value)
    {
        this.value = value;
    }

    public Object Value
    {
        get { return this.value; }
        set { this.value = value; }
    }
}

实际上,我想使用泛型,但在获取变量的类型时遇到了问题。

Item<T> item;

switch(type) // type is a string
{
    case "int":
        item = new Item<Int32>;
        break;

    case "string":
        item = new Item<String>;
        break;

    case "bool":
        item = new Item<Boolean>;
        break;
}

有人对我有什么建议吗?

编辑:对不起,我忘记了一个事实:我需要在运行时决定类型。我得到一个字符串输入,我必须通过它来识别类型!

【问题讨论】:

  • 如果你打算在泛型 type 上做一个switch,你最好不要使用泛型。
  • type 来自哪里?
  • 您想要一个可以包含Item&lt;int&gt; Item&lt;bool&gt; 的列表还是只有“纯”列表只包含一种类型的项目(即只有@987654328 @s)?
  • 我得到一个字符串,我必须确定它是数字、文本还是布尔值。纯列表就足够了,那么一种方法可能是我省略临时变量并直接将一个添加到相应的列表中。
  • 你为什么要这样做?最好的解决方案在某种程度上取决于答案。你确定永远不会有超过 3 种可能的类型吗?您是否需要将这些项目视为一个单一的同质集合?你甚至需要Item&lt;T&gt; 课程吗? (也就是说,为什么不将字符串存储为字符串,将整数存储为整数,将布尔值存储为布尔值)?

标签: c# generics


【解决方案1】:

如果您要使用 ReflectionDataBinding(您可能希望尽可能多地拥有通用元素集合),这会在该数据结构上大量工作,我个人会避免使用泛型,因为当你使用它们时故事会变得更难。

在所有其他情况下,最好使用泛型。

因此,考虑到我通过阅读您的问题获得的信息,我会说:使用泛型。

【讨论】:

    【解决方案2】:

    如果您使用“基于对象”的方法,则每次都需要投射您的项目。如果您使用泛型,则不会这样做,这就是首先使用泛型的主要原因。

    但是,我不确定您在使用泛型获取类型时遇到了什么问题,而这真的很容易。

    请查看此链接,它应该可以为您解决问题: How to get the type of T from a member of a generic class or method?

    无论如何,您必须决定,您的目标到底是什么,以及哪种方法对您来说更容易、更有效。我建议两者都尝试,考虑各种情况,然后选择最适合你的。

    请不要这样使用开关...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多