我试图创建一个类数组,首先是常规类,然后是静态类,在这两种情况下都没有用。它没有编译。
class Program
{
static class A : Bunch1 { }
static class B : Bunch1 { }
class AA : Bunch2 { }
class BB : Bunch2 { }
class Bunch1 { }
class Bunch2 { }
static void Main(string[] args)
{
Bunch1[] bunch1s = new Bunch1[] {
A,B
};
Bunch2[] bunch2s = new Bunch2[] {
AA,BB
};
}
}
编译错误是AA“是'类型'但是像'变量'一样使用”(任何类的相同错误消息 - A或B或AA或BB)
我可以看到(至少对于非静态类),我可以做到
Bunch2[] bunch2s = new Bunch2[] {
new AA(),new BB()
};
但我不想要那些类的实例。
我不想要一个对象数组。
加
实际情况为何。
我有一堆类,每个都有一个静态字段(public static char c),我想设置那个字段。
class A { public static char c; }
class B { public static char c; }
...
我可以说
A.c='x';
B.c='p';
C.c='w';
D.c='V';
但我宁愿说
char[] mychars= new char[] {'x','p','w','V'};
// create a bunchofclasses array or list consisting of classes A,B,C,D (how, I don't know).
for(int i=0; i<5;i++)
bunchofclasses[i].c= mychars[i];
答案 0 :(得分:1)
不幸的是,您不能拥有静态契约/约束,其中某些类已按其静态成员分组,以便您可以对它们进行概括并抽象地访问静态成员。它本来可以用在语言中,但不是。
尽管如此,你仍然可以用反射来做类似的事情,它只是不会像你想要的那样整洁。
class A { public static char c; }
class B { public static char c; }
class C { public static char c; }
class D { public static char c; }
var mychars = new char[] { 'a','b','c','d' };
var types = new[] {
typeof(A),
typeof(B),
typeof(C),
typeof(D)
};
for (int i = 0; i < types.Length; i++) {
var type = types[i];
var field = type.GetField("c", BindingFlags.Public | BindingFlags.Static);
if (field == null)
throw new InvalidOperationException("No such field.");
// pass null as instance for static members, since there's no instance
field.SetValue(null, mychars[i]);
}
请注意,在示例中,c
是一个字段。您需要为其他类型的成员使用其他方法(GetProperty
,GetMethod
)。
答案 1 :(得分:0)
A,B,AA,BB是类型。在第二个示例中,您正在调用new AA()
,它正在初始化可以存储在数组中的AA类型的对象。
但是,您可以存储一个包含其类型名称的字符串数组,例如
string[] strTypeArray = { "AA", "BB" }
然后致电
Type.GetType(strTypeArray[0]);
如果需要,可以获取该类型。
编辑 - 在评论中回答问题
问:为什么调用Type.GetType("AA") == null
会返回true?
因为Type.GetType()
将AssemblyQualifiedName作为输入字符串,需要您为其获取类型的程序集的名称。对我来说不幸的是,我在手机上输入了我的初始回复,并且由于此回答为answered more than once,因此我不想输入比我更多的内容。
如果您将来电更改为Type.GetType("NameOfAssembly.AA") == null
,您将获得false
的结果,并获得您想要的内容。
但是,仅仅因为您的类型与拥有该类型的实例不同,并且在您以某种方式初始化之前,您无法访问该类型中的任何属性。
可以根据类型创建类的实例,其信息为readily available。
答案 2 :(得分:0)
您可以创建类型数组
var types = new Type[]{typeof(AA), typeof(BB)}
但是,您不是存储类AA或BB的实例引用,只是存储类型。如果您愿意,您应该使用关键字 new 并将结果存储在基类数组中,
Bunch2[] bunch2s = new Bunch2[] {
new AA(),new BB()
};
您也可以从类型创建对象( 使用变量类型 )
Activator.CreateInstance(types[0])
顺便说一句,您无法创建静态类数组,也无法创建静态类的实例。
希望这有帮助