我想做一些我以前在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
这样的常规对象的数组,而是创建一个C#与Java Class
类相对应的数组。
答案 0 :(得分:0)
与Java Class<T>
在类所代表的类型上是通用的Java不同,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));
}
答案 1 :(得分:0)
在c#中我们有System.Type
你可以创建它的集合并保留其中所有类的类型。然后,您可以应用您的规则。 {#1}}在c#中用于反射目的。检查c#反射了解更多信息。这是一个简单的代码,展示了您的要求。我试图保持它非常简单,不要混合其他c#概念,以便新来的人更容易理解。
Type