2017-02-15 3 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

as-IsNotEmpty를 사용하면 더 짧아집니다. –