我可以在C#中创建一个类数组吗? (我不想要一个对象数组)

时间:2016-04-22 03:02:44

标签: c# arrays class

我试图创建一个类数组,首先是常规类,然后是静态类,在这两种情况下都没有用。它没有编译。

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];

3 个答案:

答案 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是一个字段。您需要为其他类型的成员使用其他方法(GetPropertyGetMethod)。

答案 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])

顺便说一句,您无法创建静态类数组,也无法创建静态类的实例。

希望这有帮助