创建数组类对象

本文关键字:对象 数组 创建 | 更新日期: 2023-09-27 18:29:13

我想做一些以前在Java中做过的事情,但需要在C#中做。

Java中的代码类似于:

public Class<? extends Thing>[] classes = new Class<? extends Thing>[3] {
    OneThing.class,
    AnotherThing.class
    YetAnotherThing.class
    // etc.
}

这在C#中有可能吗?最终,我要做的是拥有一个表示项目类型的类数组。然后,这个数组用于检查项的类型,以生成一个布尔值,表示该项在数组中是否有索引的超类。为了澄清,我正在检查Thing实例的类是否也是OneThingAnotherThing等的实例。

重要的是,我试图创建一个数组,而不是像Random这样的常规对象,而是Java Class类的C#对应对象

与Java不同,在Java中Class<T>对类所代表的类型是泛型的,C#的System.Type对象根本不是泛型的。您可以按如下方式创建它们的数组:

Type[] classes = new[] {
    typeof(OneThing)
,   typeof(AnotherThing)
,   typeof(ThirdThing)
};

但是,编译器无法强制检查类是否派生自或实现特定的基或接口。不过,您应该能够在没有此限制的情况下进行检查:

var obj = ... // This is your object
var res = classes.Select((t, i) => new {t, i}).FirstOrDefault(p => p.t.IsAssignableFrom(typeof(obj)));
if (res != 0) {
    Console.WriteLine("{0} assignable from {1} is found at {2}.", res.t, typeof(obj), res.i);
} else {
    Console.WriteLine("Type {0} is not found in the array.", typeof(obj));
}

创建数组类对象

在c#中,我们有System.Type,您可以创建它的集合,并在其中保留所有类的类型。然后您可以应用您的规则。Type在c#中用于反射目的。查看c#反射了解更多信息。下面是一个简单的代码,演示您的要求。我试着让它变得非常简单,不要混淆其他c#概念,这样对刚接触c#的人来说会更容易理解。

using System.IO;
using System;
using System.Collections.Generic;

class Program
{
    static List<Type> list = new List<Type>();
    static void Main()
    {
        list.Add(typeof(A));
        C c = new C();
        D d = new D();
        Check(c);
        Check(d);
    }
    static void Check(Object toBeChecked){
        foreach (Type t in list)
        {
            if(t.IsAssignableFrom(toBeChecked.GetType())){
                System.Console.WriteLine("Yes it is type of");
                return;
            }
            System.Console.WriteLine("No it is not type of");
        }
    }
}
class A{
}
class C : A{
}
class D{
}