2010-08-25 139 views
6

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

+0

是您的函数对象的返回类型(或所有对象类型返回实现一些接口)? – 2016-08-20 09:41:40

回答

4

你可以使用object[]List<object>ArrayListIEnumerable,...但如果这些类型都有一个共同的基本类型这将是更好地坚持一个强类型集合。

+2

我想念ArrayList :( – leppie 2010-08-25 08:17:01

+0

+1你在那里得到了我:) – 2010-08-25 08:17:30

7

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

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

如果你想有一个集合,可以添加对象的任何类型的再List<object>是最合适的类型。

1

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

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

3

真的,你的收藏应该尽可能具体,因为你可以做到。当你说不同类型的

对象做这些对象有什么共同点?他们是否实现了通用接口?
如果是这样你就可以专注该接口List<IMyInterface>

上的列表中,否则会List<object>做你想做的。

更新

没有,真的没有。

对不起,但我会质疑你的设计。
如果你有一个不同的对象集合,你如何决定如何使用其中一个对象?
你将有一个大型的switch语句来切换对象的类型,然后你转换到一个特定的对象并使用它。

您的工厂方法中也有类似的switch语句来创建对象。

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

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

+0

他们虽然这样做,但他们共享相同的父母。最糟糕的部分是他们有不同的实施和其他方法。所以,如果我给接口,我会错过个别类中的其他方法。有没有可以建议的模式实现? – SharpD 2010-08-25 08:26:38

9

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

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类作为收藏品,以你的价值观,你可以转换回你希望每一个类型。

0

你可以使用Genric类型

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

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

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

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

相关问题