2014-02-13 4 views
0

Буду очень благодарен за любую помощь. У меня есть строка в качестве ввода. Назовем его «table_name». Я хочу создать коллекцию table_names (где table_name является фактическим объектом в проекте, на который ссылается). Я сделал следующее:C# Получить членов общего объекта

Object obj = Activator.CreateInstance("ClassLibrary", "ClassLibrary." + table_name); 
Type CollectionType = typeof(Collection<>).MakeGenericType(new[] { obj.GetType() }); 
ICollection c = (ICollection)Activator.CreateInstance(CollectionType); 

Тогда я назвал метод (который находится в другом проекте, и который возвращает коллекцию объектов), чтобы заполнить свой объект ICollection (в данном случае, с):

object[] parameters = new object[] { x_coord, y_coord, buffer_dist}; 
c = (ICollection)sde_db.GetType().GetMethod("Method" + table_name).Invoke(sde_db, parameters); 

Пока все работает нормально. Я вижу количество элементов в коллекции. Но проблема в том, что когда я пытаюсь выполнить итерацию по коллекции, она не отображает ее элементы. Я вижу их только во время работы. Есть ли способ получить членов коллекции во время компиляции? Я хочу что-то вроде:

for(int i = 0; i < c.Count; i++){ 
    label.Text = c[i].Details; 
} 

Спасибо!

+0

Есть ли причина, по которой вы не можете просто объявить коллекцию в обычном режиме? Это похоже на невероятно крутой способ сделать это. – Magus

+0

Компилятор не знает, что они печатают во время компиляции, это определяет время выполнения. Если вы знаете во время компиляции, вам не нужно будет делать эти размышления. –

+0

Какую версию C# вы настраиваете? C# 4.0 и 5.0 имеют динамические объекты. – diegog

ответ

0

Поскольку мне нужно было только детализировать каждый элемент в ICollection, я использовал System.Xml.Serialization, чтобы получить строку, содержащую информацию об определенном элементе в коллекции.

for (int i = 0; i < c.Count; i++) 
     { 
      System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(c[i].GetType()); 
      using (StringWriter writer = new StringWriter()) 
      { 
       x.Serialize(writer, c[i]); 
       String details = writer.ToString(); 
      } 
        //do here what ever you want 
     } 
0

Да, но вам нужно ответить на вопрос о том, какие участники существуют и как вы планируете их использовать (и, самое главное, как компилятор знает, что вы имеете в виду при написании кода, ссылающегося на них, например, .Details). Например. если ваши объекты всегда будут реализовывать интерфейс ...

public interface IHasDetails 
{ 
    string Details { get; } 
} 

Затем вы можете привести объект к этому типу:

label.Text = ((IHasDetails)c[i]).Details; 

Если вы хотите получить доступ к динамически, используйте dynamic:

label.Text = ((dynamic)c[i]).Details; 
0

ICollection не определяет индексный аксессуар, поэтому вы не можете сделать c[i].

Вместо этого вы не используете IList?

0

Чтобы получить доступ к членам во время компиляции, вам необходимо использовать конкретный тип, в котором есть члены. Учитывая, что ваш динамический доступ к связанным с ним типам не представляется возможным, если у них нет общего и известного базового типа или интерфейса. Без одного из этих механизмов вы сводились к некоторому динамическому доступу.

Смежные вопросы