#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», будет просто добавить один из них.
Вопросы заключаются в следующем:
- Например, при использовании reflexion я нашел некоторые элементы, почему бы просто добавить один из них в typeContainer ?
- Почему typeContainer.AddComponent(компонент) не работает как typeContainer.AddComponent(новое имя anotheclass()), чем это отличается?
- это может привести к тем же результатам, что и 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. Спасибо , у меня есть второй метод, созданный с помощью этой логики, и он работает так, как я хочу, просто нужно посмотреть, как я могу использовать один метод для всего, что приходит!