【问题标题】:How to check if object is an array of a certain type?如何检查对象是否是某种类型的数组?
【发布时间】:2011-07-13 14:10:19
【问题描述】:

这很好用:

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

但是如何在不将 expectedType 设置为 typeof(string[]) 的情况下检查 value 是否为字符串数组?我想做类似的事情:

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

这可能吗?

【问题讨论】:

  • 您想知道对象是否被声明为字符串[]。或者如果一个 object[] 只包含某种类型的实例?

标签: c# .net arrays reflection types


【解决方案1】:

使用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))

【讨论】:

    【解决方案2】:

    您可以使用扩展方法(不是必须这样做,而是使其更具可读性):

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

    然后使用:

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

    【讨论】:

      【解决方案3】:
      value.GetType().GetElementType() == typeof(string)
      

      作为额外的奖励(但我不是 100% 确定。这是我使用的代码...)

      var ienum = value.GetType().GetInterface("IEnumerable`1");
      
      if (ienum != null) {
          var baseTypeForIEnum = ienum.GetGenericArguments()[0]
      }
      

      有了这个,你可以查找 List、IEnumerable... 并获取 T。

      【讨论】:

        【解决方案4】:

        找到的最简洁和最安全的方法是使用MakeArrayType

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

        【讨论】:

          【解决方案5】:

          你真的需要知道数组的类型吗?还是您只需要元素属于某种类型?

          如果是后者,您可以只过滤与您想要的元素匹配的元素:

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

          【讨论】:

            【解决方案6】:
            if(objVal.GetType().Name == "Object[]")
            

            数组为真

            【讨论】:

              猜你喜欢
              • 2012-06-21
              • 2011-09-28
              • 1970-01-01
              • 2012-01-03
              • 1970-01-01
              • 1970-01-01
              • 2011-03-25
              • 2020-05-27
              • 2011-11-05
              相关资源
              最近更新 更多