在反射时获得错误时抛出异常

时间:2014-04-10 08:51:06

标签: c#

我有图书馆和控制台程序。该程序动态加载库并获取int数组。但程序抛出异常。你能帮我解决一下吗? 我的图书馆:

public class Class1
{
  public int [] arrayInt;
  public Class1()
  {
    arrayInt = new int[5] {1,2,3,4,5};
  }
}

我的节目:

    Assembly asm = Assembly.LoadFile(@"C:\TestLibrary.dll");
    Type Class1 = asm.GetType("TestLibrary.Class1") as Type;
    var testClass = Activator.CreateInstance(Class1);        
    MemberInfo[] List = Class1.GetMember("arrayInt");
    foreach (FieldInfo field in List)
    {
        if (field.FieldType.IsArray)
        {
            int[] array = (int[])field.GetValue(null);//throw exception here
            Console.WriteLine("Count of list. "+array.length);              
            foreach (var element in array)
                Console.WriteLine(element.ToString());
            break;
        }
    }

异常消息:

  

System.Reflection.TargetException:非静态字段需要目标。在System.Reflection.RtFieldInfo.CheckConsistency(Object target)处于System.Reflection.RtFieldInfo.InternalGetValue(Object obj,StackCrawlMark& stackMark)的System.Reflection.RtFieldInfo.GetValue(Object obj)at Tets.Program.Main(String [])参数)

P.S。你可以修改第一个数组不从Loop获取的代码吗?

2 个答案:

答案 0 :(得分:1)

在循环中的字段变量中,您有字段的定义,当您想要获取字段的值时,您应该将对象传递给GetValue方法,因此在您的代码中,您需要编写类似这样的内容

int[] array = (int[])field.GetValue(testClass);

答案 1 :(得分:0)

由于此Field实例字段(None static),您需要将实例传递给GetValue()方法。

int[] array = (int[])field.GetValue(testClass);