#c# #system.reflection
Вопрос:
Я вижу много подобных вопросов, касающихся отражения, но не совсем то, что я ищу. Я вызываю dll во время выполнения с помощью сборки.LoadFile(). Как только я загрузил dll, мне нужно получить класс, а затем все значения свойств базового класса (которые заданы в этом коде dll). Я думал, что был близок к этому, но я не знаю, как играть, или, может быть, я совершенно неправ.
Я пытаюсь получить класс, выделенный на рисунке ниже
//This is really all I have thus far
var assembly = Assembly.LoadFile(dllFile);
var primaryInterface = assembly.DefinedTypes.FirstOrDefault(x => x.Name == "VpInterface");
//This is wrong, not giving me expected fields
var features = ((System.Reflection.TypeInfo)primaryInterface.BaseType.GetField("Features").GetType())
.DeclaredFields;
//Part of the class I am trying to retrieve
public class IntegratorFeatures
{
public string Registration { get; set; }
public string DefaultPort { get; set; }
public string PrimaryInterface { get; set; }
public string LiveCaptureType { get; set; }
public string CapturedStreamType { get; set; }
public int PtzFeatures { get; set; }
//etc, about 20 more properties after this
Я не очень хорошо знаком с Рефлексией для таких сложных задач. Как только я закодирую вышеуказанную проблему, мне нужно будет выяснить, как вызывать методы в каждом из классов библиотеки dll. Но я почему-то подозреваю, что это будет проще, чем этот первоначальный вызов (надеюсь, это правильное предположение).
Заранее благодарю за помощь
Комментарии:
1.
GetField("Features").GetType()
это получение информации о типе дляFieldInfo
. Вместо этого вам нужнаFieldType
собственность. Ты слишком много связываешь воедино, чтобы ясно это видеть.2. Как мне получить тип поля вместо этого?
3.
GetField("Features").FieldType
Ответ №1:
Попробуйте это:
public List<System.Reflection.PropertyInfo> GetFields(string AssemblyFilePath)
{
return System.Reflection.Assembly.LoadFile(AssemblyFilePath).GetTypes().First(x => x.Name == "The class name you want to get the fields for.").GetProperties().ToList();
}
Это вернет список объектов недвижимости, которые можно использовать для поиска имени объекта.
Комментарии:
1. У меня это не сработало. Я думаю, что часть проблемы заключается в том, что я пытаюсь получить свойства, определенные в унаследованном базовом классе. Этот код очень близок, но я еще не понял, что именно использовать в качестве параметра в GetValue var objectype = typeof(BaseInterface); var primaryInterface = сборка. Определенные типы. Первый по умолчанию(x => x.Name == «VpInterface»); var feature1a = основной интерфейс. Базовый тип. getField(«Функции»). GetValue(тип объекта);
Ответ №2:
Я все понял. Этот код работает, возвращая нужный базовый класс, который я искал:
var assembly = Assembly.LoadFile(dllFile);
var intPtr = new IntPtr(1);
var primaryInterface = assembly.DefinedTypes.FirstOrDefault(x => x.Name == "VpInterface");
var baseInt = new BaseInterface(intPtr);
var features =
(IntegratorFeatures)primaryInterface.BaseType
.GetField("Features", BindingFlags.Public | BindingFlags.Instance)
.GetValue(baseInt);
Мое первоначальное понимание того, как работает GetValue, заключалось в том, что я получал экземпляр нужного класса. Но, похоже, он должен соответствовать экземпляру, который я получаю в Отражении, что на самом деле является самим базовым классом, который содержит требуемый класс. Все еще немного сбивает меня с толку, но, по крайней мере, он получает нужные мне свойства.