2014-11-05 4 views
1

Я хочу сделать что-то, что я делал раньше в 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

Если я помню правильно Java (и я бы не), вы пытаетесь объявить массив _type_ случаев, когда каждый тип наследует базовый тип 'Thing'. Верный? Если это так, то я не думаю, что для этого допускается общая система ограничений C#. То есть он может сдерживать тип, основанный на том, что он наследует, но не может ограничивать _instance_ 'Type', чтобы выполнить то же самое. Вместо этого вам нужно будет внедрить что-то, что обеспечит это во время выполнения. –

+0

@PeterDuniho То, что я пытаюсь сделать, это создать массив классов, где каждый класс является дочерним элементом 'Thing'. Я проверяю, действительно ли фактический класс объекта (который в какой-то мере является «Вещь») является дочерним по отношению к классу, указанному индексом, который также передается функции (не показан). – Treyzania

+0

Хорошо, поэтому я правильно понял. В этом случае я думаю, что наиболее близким вам может быть пользовательский класс-оболочка с ограничением «где T: Тип», а затем внутренним образом принуждает ограничение T быть экземпляром 'Type', представляющим фактический тип, который наследует' Thing'. Я бы поставил пример в качестве ответа, но я бы предпочел не отговаривать экспертов по дженерикам C# от взвешивания. Я с радостью сделаю это через 12-24 часа, если никто еще не имеет. –

ответ

0

В отличие от Java, где Class<T> является общим по типу, представленному классом, System.Type Объекты C# вообще не являются общими. Вы можете создать массив из них следующим образом:

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)); 
} 
0

В 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{ 

}