Новые экземпляры, использующие отражение в словаре (c#)

#c# #dictionary #types #reflection

Вопрос:

Я использую отражение для загрузки некоторых специальных классов и создания новых экземпляров каждого найденного класса. Вот код

программа занятий {

 static void Main(string[] args)
{
 
 Container typeContainer = new Container(); // Where i want set the instances

 GetType().Assembly.GetTypes()
                 .Where(type => type.IsClass) //Filter by class
                 .Where(type => type.Name.EndsWith("Model")) // Another Filter by class name 
                 .ToList() // Set found Types in to a List
                 .ForEach(modelType => {
                     // for each Type then create a new instance using the fullname                
                     object component = viewModelType.Assembly.CreateInstance(modelType.FullName);
                     // Then add the instance into the typeContainer
                     typeContainer.AddComponent(component);
                 });  
}


public class Container {

        private Dictionary<Type, object> Component { get; } = new Dictionary<Type, object>();

        public void AddComponent<T>(T componentName)
        {
            Component[typeof(T)] = componentName;
        }

}    

}
 

Таким образом, логика отражения хорошо работает, классы, которые я нашел, будут найдены.

проблема в том, что когда я захочу добавить экземпляры с помощью «AddComponent», будет просто добавить один из них.

Вопросы заключаются в следующем:

  1. Например, при использовании reflexion я нашел некоторые элементы, почему бы просто добавить один из них в typeContainer ?
  2. Почему typeContainer.AddComponent(компонент) не работает как typeContainer.AddComponent(новое имя anotheclass()), чем это отличается?
  3. это может привести к тем же результатам, что и typeContainer.Добавить компонент(новое имя anotheclass()) с помощью отражения?

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

введите описание изображения здесь

Спасибо за продвижение

(Проект использует .net Framework 4.5)

С наилучшими пожеланиями, Джаванто

Комментарии:

1. Что такое «Рефлексия»? Это новая библиотека?

2. Ничто там не выглядит так, как будто это не входит в стандартную структуру. Я предполагаю, что это неправильное написание отражения. то есть System.Reflection

3. Похоже, этот код должен работать — вы уверены, что это не работает? .ForEach Метод должен гарантировать, что CreateInstance он вызывается столько раз, сколько обнаружено типов — какие проблемы вы видите?

4. Попытка поместить весь код в одну строку или цепочку вызовов, как вы выяснили, является плохой идеей, потому что ни вы, ни другие не имеете ни малейшего представления о том, что происходит. То же самое касается предложений. Вопрос очень трудно прочитать, и неясно, в чем проблема. Или даже если есть вопрос

5. Разделите код на отдельные строки и проверьте, каковы фактические результаты в каждой точке. Может быть только один объект, соответствующий вашим критериям. Или все объекты имеют один и тот же тип, поэтому, очевидно, AddComponent продолжайте заменять одну и ту же запись

Ответ №1:

Это сработает, если вы измените AddComponent на:

         public void AddComponent(object instance)
        {
            Component[instance.GetType()] = instance;
        }
 

Комментарии:

1. Спасибо , у меня есть второй метод, созданный с помощью этой логики, и он работает так, как я хочу, просто нужно посмотреть, как я могу использовать один метод для всего, что приходит!