C #: использование отражения, чтобы получить доступ ко всем полям в классе, возвращает ошибку - PullRequest
0 голосов
/ 18 августа 2011

Кто-нибудь может мне помочь?

У меня есть некоторый код отражения, который я написал, и он, кажется, работает хорошо, но выдает ошибку при попытке передать "this" в GetValue.

Я немного застрял, думаю, проблема в том, что я запускаю код отражения в frmMain, и AbCCompany определена в другом проекте, но у меня есть ссылка.

Я получаю ошибку

Поле 'AbcCompany', определенное для типа 'MyApp.Companies.Config', не является полем целевого объекта типа MyApp.frmMain.

Воткод ..

        var companies = MyIems.Companies.GetType().GetFields();


        foreach (var list in companies )
        {

            List<CompanyBase> thisCompanyCollection = (List<CompanyBase>)list.GetValue(this);
            foreach (var company in thisCompanyCollection )
            {
                Console.WriteLine();
            }
        }

РЕДАКТИРОВАТЬ

Я забыл упомянуть, что внутри "Companies" есть много List, где xxx - это класс .. все классы наследуются от CompanyBase,т.е. AbcCompany

1 Ответ

4 голосов
/ 18 августа 2011

Вместо ввода this в GetValue вам нужно передать экземпляр MyApp.Companies.Config.

Если вы посмотрите на документацию , вы увидите, что вы получаете исключение, потому что параметр obj не относится к типу (или наследуется от него), в котором объявлено текущее поле .

Предполагая, что MyApp.Companies.Config имеет конструктор без параметров, должно работать следующее:

var type = MyItems.Companies.GetType();

var instance = type.GetConstructor(System.Type.EmptyTypes).Invoke(null);

foreach(var list in type.GetFields())
{
    List<CompanyBase> thisCompanyCollection = (List<CompanyBase>)list.GetValue(instance);
    foreach(var company in thisCompanyCollection)
    {
        Console.WriteLine(company);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...