IT박스

객체가 특정 유형의 배열인지 확인하는 방법은 무엇입니까?

itboxs 2020. 12. 4. 08:01
반응형

객체가 특정 유형의 배열인지 확인하는 방법은 무엇입니까?


이것은 잘 작동합니다.

var expectedType = typeof(string);
object value = "...";
if (value.GetType().IsAssignableFrom(expectedType))
{
     ...
}

값을 설정하지 않고 문자열 배열입니다하지만 어떻게 확인합니까 expectedType에가 typeof(string[])? 다음과 같이하고 싶습니다.

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType().IsArrayOf(expectedType)) // <---
{
     ...
}

이것이 가능한가?


Type.IsArrayType.GetElementType ()사용 하여 배열의 요소 유형을 확인합니다.

Type valueType = value.GetType();
if (valueType.IsArray && expectedType.IsAssignableFrom(valueType.GetElementType())
{
 ...
}

Type.IsAssignableFrom () 주의하십시오 . 유형이 정확히 일치하는지 확인하려면 같음 ( typeA == typeB)을 확인해야합니다 . 주어진 유형이 유형 자체인지 서브 클래스 (또는 인터페이스)인지 확인하려면 다음을 사용해야합니다 Type.IsAssignableFrom().

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass))

확장 메서드 를 사용할 수 있습니다 ( 필수 는 아니지만 더 읽기 쉽게 만들 수 있음 ).

public static class TypeExtensions
{
    public static bool IsArrayOf<T>(this Type type)
    {
         return type == typeof (T[]);
    }
} 

그리고 다음을 사용하십시오.

Console.WriteLine(new string[0].GetType().IsArrayOf<string>());

찾은 가장 간단하고 안전한 방법은 다음을 사용하는 것입니다 MakeArrayType.

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
     ...
}

value.GetType().GetElementType() == typeof(string)

추가 보너스로 (하지만 100 % 확실하지는 않습니다. 이것이 제가 사용하는 코드입니다 ...)

var ienum = value.GetType().GetInterface("IEnumerable`1");

if (ienum != null) {
    var baseTypeForIEnum = ienum.GetGenericArguments()[0]
}

이것으로 List, IEnumerable ...을 찾고 T를 얻을 수 있습니다.


실제로 어레이 유형을 알아야합니까? 아니면 특정 유형의 요소 만 필요합니까?

후자의 경우 원하는 항목과 일치하는 요소 만 필터링 할 수 있습니다.

string[] strings = array.OfType<string>();

if(objVal.GetType().Name == "Object[]")

배열의 경우 참

참고 URL : https://stackoverflow.com/questions/5274865/how-to-check-if-object-is-an-array-of-a-certain-type

반응형