【问题标题】:list of mixed string and int types [duplicate]混合字符串和 int 类型的列表 [重复]
【发布时间】:2018-11-07 01:44:02
【问题描述】:

我正在尝试列出泛型类型(实际上我只需要字符串和 int)。两个对象都有名称(字符串)但值不同(整数或字符串)

public class Setting
{    
    public string Name { get; set; }   
}

public class Setting<T> : Setting
{
    public T Value { get; set; }

    public Type Type
    {
        get
        {
            return typeof(T);
        }
    }    
}

名单如下:

List<Setting> list = new List<Setting>();
list.Add(new Setting<int> { Name = "one", Value = 10 } );
list.Add(new Setting<string> { Name = "two", Value = "string value" });

但是,当我尝试获取该值时,它是不存在的。

list[0].Value ????

这个可以吗?

编辑:

令人惊讶的是它是多么简单(与泛型、接口相比),感谢@Patrick Hofman 的“对象”提示。

    public class Settings
    {
        public string Name { get; set; }
        public object Value { get; set; }
    }

Fields = new List<Settings>{
                        new Settings { Name = "Three", Value = "Three_value" },
                        new Settings{ Name = "Four", Value = 22 },
                        new Settings { Name = "Two", Value = "22" }
                    }

像魅力一样工作。

【问题讨论】:

  • 不,这是不可能的。首先:泛型应该适用于 any 类型,而不仅仅是 stringint。第二:你应该问问自己,这些类型有什么共同点。有什么可以用字符串 整数来完成的吗?从我的角度来看,并不多。不要将没有任何共同点的类型实例放入一个非泛型列表中。即使你能做到这一点,当你写list[0] 时,你期望什么类型?编译器肯定只能提供Setting,但你永远不会知道它实际上是Setting&lt;string&gt; 还是Setting&lt;int&gt;
  • C# 不能很好地支持这个习语,因为它不支持 sum 类型(AKA discriminated unions)。你能得到的最好的结果是通过object 工作。 (或者使用library,但对于简单的用例,它是矫枉过正的。)
  • 您的列表是针对Setting 键入的,它没有Value 属性。
  • 另一个想法是有接口,例如IValue,它定义了object Value 并让Setting&lt;T&gt; 实现它,但是你有List&lt;IValue&gt; 并且不能在没有强制转换的情况下调用Setting 的方法。

标签: c#


【解决方案1】:

不是最优雅的解决方案,但它会起作用:

public class Setting
{

    public string Name { get; set; }

    public object Value { get; protected set; }
}

public class Setting<T> : Setting
{
    public new T Value { get { return (T)base.Value; } set { base.Value = value; } }

    public Type Type
    {
        get
        {
            return typeof(T);
        }
    }
}

实际上,您将值存储在基类中,然后将其转换为派生类。

我建议检查你的设计,如果你真的需要泛型。如图所示,这违背了泛型的目的。

【讨论】:

  • 我个人喜欢这个解决方案,并且在不强制类成为泛型而是方法时经常使用它。这可以在更灵活地调用时保证类型安全。
  • @Patrick Hofman 非常感谢!
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多