创建数组类对象
本文关键字:对象 数组 创建 | 更新日期: 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
实例的类是否也是OneThing
、AnotherThing
等的实例。
重要的是,我试图创建一个数组,而不是像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{
}