不能直接使用属性,需用InvokeMember来实现

解决方案 »

  1.   

    using System;
    using System.Reflection;// This sample class has a field, constructor, method, and property.
    class MyType 
    {
        Int32 myField;
        public MyType(ref Int32 x) {x *= 5;}
        public override String ToString() {return myField.ToString();}
        public Int32 MyProp 
        {
            get {return myField;}
            set 
            { 
                if (value < 1) 
                    throw new ArgumentOutOfRangeException("value", value, "value must be > 0");
                myField = value;
            }
        }
    }class MyApp 
    {
        static void Main() 
        {
            Type t = typeof(MyType);
            // Create an instance of a type.
            Object[] args = new Object[] {8};
            Console.WriteLine("The value of x before the constructor is called is {0}.", args[0]);
            Object obj = t.InvokeMember(null, 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
            Console.WriteLine("Type: " + obj.GetType().ToString());
            Console.WriteLine("The value of x after the constructor returns is {0}.", args[0]);        // Read and write to a field.
            t.InvokeMember("myField", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.SetField, null, obj, new Object[] {5});
            Int32 v = (Int32) t.InvokeMember("myField", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.GetField, null, obj, null);
            Console.WriteLine("myField: " + v);        // Call a method.
            String s = (String) t.InvokeMember("ToString", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);
            Console.WriteLine("ToString: " + s);        // Read and write a property.
            try 
            {
                t.InvokeMember("MyProp", 
                    BindingFlags.DeclaredOnly | 
                    BindingFlags.Public | BindingFlags.NonPublic | 
                    BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {0});
            } 
            catch (TargetInvocationException e) 
            {
                if (e.InnerException.GetType() != 
                    typeof(ArgumentOutOfRangeException)) 
                    throw;
                Console.WriteLine("Catch the property set.");
            }
            t.InvokeMember("MyProp", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {2});
            v = (Int32) t.InvokeMember("MyProp", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.GetProperty, null, obj, null);
            Console.WriteLine("MyProp: " + v);
        }
    }
      

  2.   

    用反射即可实现.
    ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTypeClassGetMembersTopic1.htm
    ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTypeClassGetPropertiesTopic1.htm