C#: Using reflection to get access to all fields within a class, returns error

坚强是说给别人听的谎言 提交于 2020-01-17 01:20:08

问题


can anyone help me?

I have some reflection code that i have written and it seems to work well but it gives me an error when trying to pass in "this" to the GetValue.

I am a little stuck, i think the problem is that i am running the reflection code in frmMain adn the AbCCompany is defined in another project but i have a reference.

I get the error

Field 'AbcCompany' defined on type 'MyApp.Companies.Config' is not a field on the target object which is of type 'MyApp.frmMain'.

Here is the code..

        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();
            }
        }

EDIT

I forgot to mention that Inside "Companies" is lots of List where xxx is a class.. all classes inherit from CompanyBase. i.e AbcCompany


回答1:


Instead of passing in this to GetValue you need to pass an instance of MyApp.Companies.Config.

If you look at the documentation, you can see that the exception your getting is because the obj parameter isn't of the type (or inherits from it) that the current field is declared on.

Assuming that MyApp.Companies.Config has a parameterless constructor, the following should work:

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);
    }
}


来源:https://stackoverflow.com/questions/7110521/c-using-reflection-to-get-access-to-all-fields-within-a-class-returns-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!