【问题标题】:Get actual type from array从数组中获取实际类型
【发布时间】:2013-02-14 11:38:42
【问题描述】:

举个例子:

IColor[] items;
items = new IColour[]{ new SomeColour() };

如何使用反射来查看项目并获得typeof(SomeColour) 而不是typeof(IColour)?使用我熟悉的,typeof(items).GetElementType() 给我IColour,而不是实际类型。

【问题讨论】:

  • 对所有项目的类型进行分组(使用 GetType()),然后获取最不具体的类型。
  • @DeX3r:那甚至不会编译
  • typeof(items).GetElementType().DeclaringType 离开我的头顶,所以不要发布作为答案
  • @Zonder:你的也不会编译,而且你没有阅读问题。
  • @Bazzz 它不应该给你任何东西,因为typeof 运算符是类型文字的语法,而不是在运行时反映对象类型的方法。

标签: c# arrays generics reflection


【解决方案1】:

你所要求的是不可能的。您的数组可以存储多个项目,每个项目都有不同的具体类型。

您的数组类型是IColor。存储在索引 0 处的项目的类型是 SomeColour。如果您在数组中添加了第二个项目:AnotherColour。 items 的类型应该是什么?

您可以使用items[index].GetType() 获取存储在数组中的项目的类型,其中index 指向数组中的位置。

【讨论】:

  • 谢谢。我想答案的重点是:1)我不能在一个空数组上做,2)如果我假设数组中的所有元素都是相同的具体类型,我从第一个元素中获取类型数组,否则 3) 我必须遍历整个数组以获取每个项目的类型。
  • 如果您知道所有元素都属于同一类型,您还可以将数组的类型更改为更具体的类型。如果您的数组是 SomeColour[],那么 SomeColour 就是您的数组类型。如果您不确定所有元素是否都具有相同的类型,则表明整个数组没有一种特定类型。
  • 当然可以,但在这种情况下,我正在实例化容器类,其中每个类都有不同的 IColour 实现,而我正在为 UI 做这种反射废话(它是 Unity3D,所以它有一些不让我太花哨的怪癖)。
【解决方案2】:

也许是这个?

foreach (var item in items)
{
    var t = item.GetType();
}

t 应该是 SomeColur、OtherColur 等。

【讨论】:

    【解决方案3】:

    typeof(items).GetElementType 是 IColor,因为它是 IColor 的列表。

    获取特定元素的底层类型:

    IColor item = items[<someIdx>];
    item.GetType();
    

    【讨论】:

      【解决方案4】:

      如果你有一个IColor[],那么关于“实际类型”你只能说:IColor。例如,您可以:

      class Foo : IColor {...}
      class Bar : IColor {...}
      

      并有一个 IColor[] 数组,其中包含 2 个 Foo 和 3 个 Bar。现在:什么是“类型”?

      如果数组不是空的,你可以看看,比如说,第一项:

      var type = items[0].GetType();
      

      但如果数据是异构的,这将无济于事。您可以检查 distinct 类型并希望它是同质的:

      var type = items.Select(x => x.GetType()).Single();
      

      【讨论】:

        【解决方案5】:

        这只是@Wouter de kort 所说的一个例子

        internal class Program
        {
            private static void Main(string[] args)
            {
                IColour[] items;
                items = new IColour[] { new SomeColour(), new SomeOtherColour() };
        
                Console.WriteLine(items.GetType().GetElementType().Name);  // Will always return IColour
        
                foreach (var item in items)
                {
                    Console.WriteLine(item.GetType().Name); // Will return the name of type added with the IColour interface
                }
        
                Console.ReadLine();
            }
        }
        
        internal interface IColour
        { }
        
        internal class SomeColour : IColour
        { }
        
        internal class SomeOtherColour : IColour
        { }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-07
          • 2016-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多