Использование отражения для получения объявленных полей класса базового типа

#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, заключалось в том, что я получал экземпляр нужного класса. Но, похоже, он должен соответствовать экземпляру, который я получаю в Отражении, что на самом деле является самим базовым классом, который содержит требуемый класс. Все еще немного сбивает меня с толку, но, по крайней мере, он получает нужные мне свойства.