如果你不知道 test1 类的定义,那你怎么知道 test1 类会有一个 sarr 的字段呢, 怎么知道他是一个数组类型呢?

解决方案 »

  1.   

    int [] a={1,2};
       Type type=a[1].GetType();
       MessageBox.Show (type.ToString ());
      

  2.   

    严重同意 exboy(kuku) ,这不是一个反射的问题,这是一个逻辑的问题,在你不知道羊是什么动物的时候,你如何去问别人,羊有几条腿,因为你甚至不知道,羊有没有腿!
      

  3.   

    trystring [] sarr = ( string [] ) GetValue(  Test1, sarr, test1 );
    //
    public object GetValue( string className, string propertyName, object objInstance )
    {
    Type type = Type.GetType( className, true, true );
    PropertyInfo propertyInfo = type.GetProperty( propertyName );
    object obj = propertyInfo.GetValue( objInstance, null );
    return ( object ) obj;
    }
      

  4.   

    Type t1 = test1.GetType();
    string className = t1.Name;
    FieldInfo[] fi = t1.GetFields();
    FieldInfo[] ff = t3.GetFields();
    for (int i = 0; i < fi.Length; i++)
    {
       Type tt1 = fi[i].FieldType;
       string pp = fi[i].Name;
       if (tt1.IsArray) 
       {
           string [] sarr = ( string [] ) GetValue( className, pp, test1 );
        }   public static object GetValue( string className, string propertyName, object objInstance )
       {
    Type type = objInstance.GetType();
    PropertyInfo propertyInfo = type.GetProperty( propertyName );
    object obj = propertyInfo.GetValue( objInstance, null );
    return ( object ) obj;
       }
    运行到这一步出错,PropertyInfo propertyInfo = type.GetProperty( propertyName );大家帮我看看什么原因?
      

  5.   

    老兄,你先 GetFields(),然后又用其中一个 Field 去 GetProperty(),看出问题了吗?
    Field 跟 Property 根本不是一回事!// Field
    private string myname = String.Empty;// Property
    public string Name
    {
        get { return myname; }
        set { myname = value; }
    }
      

  6.   

    试试改用 GetFields() && GetField(),或者让 Test1 类实现一个 ITest1 接口,并在 Assembly 外部公开这个接口,就可以通过 GetType() && GetInterface() && CreateInstance() 创建 Test1 类在 ITest1 上的实例,并获取 sarr[] 元素的值。不过楼主好像没有把问题说明白,建议你把问题的全部说出来,而不是局部。参考上下文,才能得到最好的解决方案。“反射”是基于 Assembly 的,也就是说反射对应的是一个 DLL(当然也可以是EXE),使用反射技术可以获取这个 Assembly 的 namespaces、types、interfaces、fields、properties、attributes 等等,并创建它们的实例。“假如我不知道类的定义,只知道一个对象test1”,那么试问1.这个对象是怎么创建的?是在Assembly内部还是外部创建的?
    2.如果是内部创建的,又是怎么传递到Assembly外部的?如果你的问题是要在 Assembly 外部动态创建 Test1 类的实例,并获取 sarr[] 元素的值,那么就必须事先知道这个类的定义。
      

  7.   

    这样可以:
    object obj = fi[i].GetValue(test1);
      

  8.   

    Type t1 = test1.GetType();
    string className = t1.Name;
    Console.WriteLine(className);
    FieldInfo[] fi = t1.GetFields();for (int i = 0; i < fi.Length; i++)
    {
    Type tt1 = fi[i].FieldType;
    if (tt1.IsArray) 
    {
    object [] sarr = (object []) fi[i].GetValue(test1);
    for (int j = 0; j < sarr.Length; j++)
    {
    Console.WriteLine(sarr[0].Equals(sarr[1]));
    }
    }}
    解决如上