Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2012, 12:56   #1
KorPaEv
Пользователь
 
Аватар для KorPaEv
 
Регистрация: 08.07.2011
Сообщений: 42
По умолчанию Коллекция наследников класса определенного типа.

Всем доброго времени суток!

Вопрос следующий, существует стандартный метод класса Assembly, GetType(), который возвращает коллекцию всех типов загруженных в приложение.

Но мне нужен метод, тоже стандартный, который возвращает всех наследников определенного типа загруженного в приложение.

Дело вот в чем, я написал свой класс атрибутов

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace GraphEditor
{
    [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
    public class FiguresAttribute : Attribute
    {
        string nameClass;
        public FiguresAttribute(string nameFigureClass)
        {
            this.nameClass = nameFigureClass;
        }
 
        public string Name
        {
            get { return nameClass; }
        }
    }
}
Так же у меня есть классы, которым я проставил атрибут данного класса, он мне возвратит имя фигуры (пишу граф.редактор), например для круга

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
 
namespace GraphEditor
{
    [FiguresAttribute(name)]
    class Circle : Figure
    {
        const string name = "Круг";
        Rectangle rect = new Rectangle();
 
        public Circle()
        {
            this.Name = name;
        }
 
    }
}
[FiguresAttribute(name)] - вот у меня атрибут класса. Таких классов у меня несколько, т.к. фигур несколько, так вот, я на форме хочу в список выбора фигуры поместить сразу имя, полученное атрибутом, сейчас я написал так

Код:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
 
namespace GraphEditor
{
    public partial class GraphEditorMainForm : Form
    {
        public GraphEditorMainForm()
        {
            InitializeComponent();
            Type type = typeof(Triangle); //Вот тут руками определяю тип класса
            FiguresAttribute figA = (FiguresAttribute)type.GetCustomAttributes(typeof(FiguresAttribute), true)[0]; //Вот тут получаю имя
            figureListBox.Items.Add(figA.Name); //Добавляю в список
            
            //figureListBox.Items.Add(typeof(Square));
            //figureListBox.Items.Add(typeof(Circle));
        }
 
        Figure selectedFigure = null;
        List<Figure> figurs = new List<Figure>();
        
        private void figureListBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            Type t = (Type)figureListBox.SelectedItem; //И еще сразу вопрос по этому - вываливается эксепшн, потому что в атрибут приходит string а тут type, как это лечится??
            Figure fig = (Figure)Activator.CreateInstance(t);
            fig.PropertyChanged += new EventHandler<EventArgs>(ChangePropertyEvent);
            selectedFigure = fig; //Запоминаем выбранную фигуру
            propertyGrid.SelectedObject = fig; //Записываем фигуру в пропертигрид
        }
 
    } 
}
Так вот чтобы не писать для каждой фигуры свой объект типа, какой есть метод чтобы получить всю коллекцию??? Я просто его не могу найти, может он где то в рефлексии болтается??

Спасибо!
Created by KorPaEv...
KorPaEv вне форума Ответить с цитированием
Старый 11.05.2012, 13:17   #2
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

не знаю на счет правильности...

Код:
Assembly.GetExecutingAssembly().GetExportedTypes().Where(i=>i.IsSubclassOf(typeof(T)))
GetExportedTypes возвращает только public типы
IsSubclassOf праверяет является ли наследником
Reskov вне форума Ответить с цитированием
Старый 11.05.2012, 13:26   #3
KorPaEv
Пользователь
 
Аватар для KorPaEv
 
Регистрация: 08.07.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Reskov Посмотреть сообщение
не знаю на счет правильности...

Код:
Assembly.GetExecutingAssembly().GetExportedTypes().Where(i=>i.IsSubclassOf(typeof(T)))
GetExportedTypes возвращает только public типы
IsSubclassOf праверяет является ли наследником
Спасибо, буду пробовать
Created by KorPaEv...
KorPaEv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение типа класса по переменной на объект этого класса при компиляции phomm Общие вопросы Delphi 24 08.04.2011 14:11
C# Listbox, коллекция и объект класса byte916 Помощь студентам 0 22.10.2010 03:18
Коллекция объектов класса в С++ MarihuanaP Помощь студентам 2 09.05.2010 13:06
Как сделать чтобы файлы определенного типа открывались программой? Вадим Буренков Общие вопросы Delphi 3 07.07.2009 13:47
Создание файла определенного типа Македонский Общие вопросы Delphi 12 06.09.2007 11:58