将不同的对象类型添加到c#4.0集合中

时间:2010-08-25 08:10:24

标签: c#-4.0

我有一个函数,它根据传递给该函数的参数返回不同类型的对象。 是否可以根据C#4.0中的某些标识符将这些不同的对象类型添加到集合中? 通常我们会这样做 列表或列表 但我想要一个可以添加任何类型对象的集合。

9 个答案:

答案 0 :(得分:10)

您可能希望定义一个接口,例如List<object>,其中包含您的对象需要实现的一些方法,而不仅仅像其他海报一样制作IListableObject。这将使使用这些对象的任何代码更容易编写,并防止不需要的对象进入集合中。

答案 1 :(得分:7)

是的,它被称为object。例如:

var objlist = new List<object>();
objlist.Add(1);
objlist.Add(true);
objlist.Add("hello");

答案 2 :(得分:4)

您可以使用object[]List<object>ArrayListIEnumerable,...但如果这些类型具有共同的基本类型,那么最好坚持使用强类型集合。

答案 3 :(得分:3)

真的,你的收藏应该尽可能具体。当你说

  

不同类型的对象

这些物体有什么共同之处吗?他们是否实现了通用界面? 如果是这样,您可以专门化该界面上的列表List<IMyInterface>

否则List<object>会做你想做的事。

<强>更新

不,不是真的。

我很抱歉,但我会质疑你的设计 如果您有一组不同的对象,您如何决定如何使用其中一个对象? 您将有一个大的switch语句切换对象的类型,然后您转换为特定的对象并使用它。

您的工厂方法中也有一个类似的switch语句,用于创建对象。

面向对象的一个​​好处是,如果你正确地设计你的对象,那么你就不需要做这些大的“如果这个对象做这个.Method(),如果它是那个对象那么做.OtherMethod() ”

我可以问,为什么要将不同的对象放入同一个集合中?对你有什么好处?

答案 4 :(得分:1)

如果您想要一个可以添加任何类型对象的集合,那么List<object>是最合适的类型。

答案 5 :(得分:1)

早期版本的C#(非泛型)中的集合可以包含任何类型的对象。如果它们是值类型,它们将被装入对象中。 当您需要使用它们时,您可以将它转换为原始类型。

您可以使用List<Type>来保存类型信息,如果这是您想要的。而Type [],Hashtable等也没关系。您可以使用typeof运算符来获取类型或使用Object.GetType()。

答案 6 :(得分:1)

另请查看动态类型。

http://msdn.microsoft.com/en-us/library/dd264736.aspx

它基本上会做同样的事情。

答案 7 :(得分:0)

我的建议:

public class ParamValue
{
    object value = null;
    public ParamValue(object val)
    {
        value = val;
    }

    public string AsString()
    {
        return value.ToString();
    }

    public int AsInt()
    {
        return int.Parse(value.ToString());
    }

    public int? AsNullableInt()
    {
        int n;

        if (int.TryParse(value.ToString(), out n))
        {
            return n;
        }

        return null;
    }

    public bool AsBool()
    {
        return bool.Parse(value.ToString());
    }

    public bool? AsNullableBool()
    {
        bool b;

        if (bool.TryParse(value.ToString(), out b))
        {
            return b;
        }

        return null;
    }
}

public class Params
{
    Dictionary<string, object> paramCol = new Dictionary<string, object>();

    public void Add(string paramName, object value)
    {
        paramCol.Add(paramName, value);
    }

    public ParamValue this[string paramName]
    {
        get
        {
            object v;

            if (paramCol.TryGetValue(paramName, out v))
            {
                return new ParamValue(v);
            }

            return null;
        }
    }
}

使用param类作为值的集合,您可以将返回值转换为您想要的每种类型。

答案 8 :(得分:0)

您可以使用Genric类型元组

public Tuple<T, T> MySuperMethod()
{
   int number = 1;
   string text = "Batman";

   return new Tuple<int, string>(number, text);
}
  

.NET Framework直接支持一到七个元组   元素。此外,您可以创建八个或更多元素的元组   通过将元组对象嵌套在Tuple对象的Rest属性中。

https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.100).aspx