将FieldInfo转换为C#中的列表

时间:2016-08-29 11:21:48

标签: c# reflection

我有这样的字符串数组:

namespace DynamicCore
    {
        public class DynamicCode
        {
            List<Variable> variableList = new List<Variable>();
            public DynamicCode()
            {
                Variable Variable = new Variable();                    
                Variable.ID = "Variable_26545789";
                Variable.Type = 1;

                variableList.Add(Variable);

                Variable = new Variable();
                Variable.ID = "Variable_vdvd3679";
                Variable.Type = 2;

                variableList.Add(Variable);
            }
        }
    }

我编译了这个数组并将其存储到内存中。我通过以下代码获得variableList

string name = "DynamicCore.DynamicCode";
Type type = results.CompiledAssembly.GetType(name, true);
object instance = Activator.CreateInstance(type);    
FieldInfo filed = type.GetField("variableList", 
                                 BindingFlags.Instance | 
                                 BindingFlags.NonPublic);

我尝试将filedvariableList)投射到List<Variable>,如下所示:

List<Variable> Variables = (List<Variable>)filed;

但我收到了这个错误:

Cannot convert type 'System.Reflection.FieldInfo' to 'System.Collections.Generic.List<Variable>'    

如果有人可以解释这个问题的解决方案,那将非常有用。

2 个答案:

答案 0 :(得分:2)

您的变量filed中包含有关您的字段Variable的元数据。使用此元数据,您可以找到它所在的类,如果它是私有的等等。

你想要别的东西。您想要检索使用它的字段的值。你需要一个额外的步骤:

object theActualValue = filed.GetValue(instance);

您可以使用此值转换到您的列表:

List<Variable> Variables = (List<Variable>)theActualValue;

我的建议是重命名这些东西,使其更具可读性。您的代码可能如下所示:

FieldInfo field = type.GetField("variableList", 
                             BindingFlags.Instance | 
                             BindingFlags.NonPublic);
List<Variable> variables = (List<Variable>)field.GetValue(instance);

答案 1 :(得分:1)

filed只是FieldInfo描述字段的对象,它不是字段的

要获取字段的值,请使用GetValue,如下所示:

var list = (List<Variable>)filed.GetValue(instance);

这将返回实例variableList的字段instance的值。