Добавление различных типов объектов в коллекцию ac # 4.0 - PullRequest
6 голосов
/ 25 августа 2010

У меня есть функция, которая возвращает объекты разных типов на основе параметра, переданного этой функции.Можно ли добавить эти различные типы объектов в коллекцию на основе некоторого идентификатора в C # 4.0?Обычно мы делаем что-то вроде этого списка или списка, но я хочу одну коллекцию, которая может добавить объект любого типа.

Ответы [ 9 ]

11 голосов
/ 25 августа 2010

Вместо того, чтобы просто указывать List<object>, как рекомендуют другие авторы, вы можете определить интерфейс, например IListableObject, который содержит несколько методов, которые ваши объекты должны реализовать. Это значительно облегчит написание любого кода, использующего эти объекты, и защитит от нежелательных объектов, попадающих в коллекцию в дальнейшем.

7 голосов
/ 25 августа 2010

Да, это называется object.Например:

var objlist = new List<object>();
objlist.Add(1);
objlist.Add(true);
objlist.Add("hello");
4 голосов
/ 25 августа 2010

Вы можете использовать object[], List<object>, ArrayList , IEnumerable , ... но если эти типы имеют общий базовый тип, было бы лучше придерживатьсястрого типизированная коллекция.

3 голосов
/ 25 августа 2010

Действительно, ваша коллекция должна быть настолько специфичной, насколько вы можете это сделать. Когда вы говорите

объекты разных типов

Есть ли у этих объектов что-нибудь общее? Они реализуют общий интерфейс?
Если это так, вы можете специализировать список на этом интерфейсе List<IMyInterface>

В противном случае List<object> будет делать то, что вы хотите.

Обновление

Нет, не совсем.

Извините, но я собираюсь поставить под сомнение ваш дизайн.
Если у вас есть коллекция различных объектов, как вы решаете, как использовать один из объектов?
У вас будет большой оператор switch для переключения типа объекта, затем вы приведете к конкретному объекту и будете его использовать.

У вас также есть аналогичный оператор switch в вашем фабричном методе, который создает объект.

Одним из преимуществ объектной ориентации является то, что если вы правильно проектируете свои объекты, вам не нужно делать эти большие "Если это этот объект, то делайте это. ».

Могу я спросить, почему вы кладете разные предметы в одну коллекцию? В чем выгода?

1 голос
/ 25 августа 2010

Также проверьте Динамический тип.

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

Это будет в основном то же самое.

1 голос
/ 25 августа 2010

Коллекции в более ранних версиях C # (не generics) могут содержать объекты любого типа. Если они имеют тип значения, они будут помещены в объект. Когда вам нужно использовать их, вы можете просто привести их к исходному типу.

Вы можете использовать List<Type> для хранения информации о типе, если вы этого хотите. И Type [], Hashtable и т. Д. Тоже хорошо. Вы можете использовать оператор typeof для получения типа или использовать Object.GetType ().

1 голос
/ 25 августа 2010

Если вы хотите коллекцию, которая может добавлять объекты любого типа, тогда List<object> - наиболее подходящий тип.

0 голосов
/ 20 августа 2016

Вы могли бы использовать кортеж из родовых типов

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

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

.NET Framework напрямую поддерживает кортежи от одного до семи элементы. Кроме того, вы можете создавать кортежи из восьми или более элементов путем вложения объектов кортежа в свойство Rest объекта Tuple.

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

0 голосов
/ 09 июля 2016

Мое предложение:

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 в качестве совокупности ваших значений, вы можете преобразовать возвращаемый результат в любой тип, который вам нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...