2017-02-15 14 views
0

Мне нужно преобразовать список строк в список объектов, но дело в том, что я получаю этот список как объект, потому что это параметр, и я не знаю, какой тип он ,C# Преобразование объекта в список <object>

Это функция, которая принимает параметр:

public static bool IsNotEmpty(object obj) 
{ 
    if (obj is ICollection) 
    { 
     IList<object> collection = (IList<object>)obj; // The cast throws error here 
     return IsNotEmpty(collection); 
    } 

    return true; 
} 

И это один это один использует:

public static bool IsNotEmpty<T>(IList<T> aList) 
{ 
    return aList != null && aList.IsNotEmpty(); 
} 

Что я могу сделать, чтобы бросить его в список объектов, так то я могу передать его другой функции? (если есть способ)

+2

Почему вы хотите, чтобы IsNotEmptyString принимал объект вместо строки? – EpicKip

+2

IsNotEmptyString - это ужасно вводящее в заблуждение имя для этой функции – BugFinder

+0

Извините, я изменил функцию, чтобы отобразить ее здесь! Теперь он фактически преобразуется в Список строк. – Tobi

ответ

2
public static bool IsNotEmpty(object obj) 
    { 
     var collection = obj as ICollection; 
     return collection == null || collection.Count > 0; 
    } 
8

Вы выполняете то, что мы называем «вопросом XY»: у вас есть (неправильное) решение для вашей проблемы, и вы спрашиваете о своем неправильном решении, а не ищете решение для вашей реальной проблемы.

Вам не нужно преобразовывать список строк в список объектов в первую очередь, поэтому нет необходимости спрашивать, как это сделать. Правильное решение вашей проблемы:

static class MyExtensions 
{ 
    public static bool Any(this IEnumerable sequence) 
    { 
    if (sequence == null) 
     throw new ArgumentNullException ... etc ... 
    if (sequence is ICollection) 
     return ((ICollection)sequence).Any(); 
    foreach(object item in sequence) 
     return true; 
    return false; 
    } 
    public static bool Any(this ICollection collection) 
    { 
     if (collection == null) blah blah blah 
     return collection.Count > 0; 
    } 
} 

Отлично. Теперь ваш метод:

public static bool IsNotEmpty(object obj) 
{ 
    if (obj is IEnumerable) 
    return ((IEnumerable)obj).Any(); 
    else 
    return true; 
} 

Идея заключается в том, чтобы сначала перейти в коллекцию, потому что избегает перечисления последовательности без необходимости. Это может быть дорого. Но если у нас есть последовательность, у которой есть элементы, но не коллекция, перечислим ее первый элемент. Если мы сможем сделать это успешно, то это не пусто; если мы не можем, то оно пусто.

Но в целом: подпись вашего метода является неудачной. Не попадайте в ситуацию, когда у вас есть object в руке, в первую очередь, если вы можете избежать этого. Как вы попали в эту ситуацию?

+1

Последний абзац я считаю самым значительным. Мне бы очень хотелось знать, почему OP имеет «объект», а не какую-то типизированную коллекцию для работы. Я подозреваю, что именно эта проблема действительно должна быть решена. – TheInnerLight

+0

Если вы используете как - IsNotEmpty будет короче –

 Смежные вопросы

  • Нет связанных вопросов^_^