徐磊ID:xiaolei1982
30067次访问,排名3684(2)好友4人,关注者91
热爱足球,篮球,台球等各项体育运动;
xiaolei1982的文章
原创 38 篇
翻译 0 篇
转载 38 篇
评论 21 篇
xiaolei1982的公告
这两天总结了一些东西,写得有点乱,里面有很多是自己认为的,所以会有不对的地方,希望阅读的朋友如果看到有错误的话请给予指出,以免误人子弟。
最近评论
dupeng0811:学习……学习……
xiaolei1982:粘贴就可运行,大家可以看看效果
dupeng0811:学习……学习……
xiaolei1982:我真服气csdn了怎么再保存一遍成这个样了,
要改都没法改,
增加一点对于该模板类,还可以 $html->expandir('FILAS', '+filas');
也就是当循环的时候多条输出,
同时可以利用php文件的
fsockopen来抓取远程地址;
以上留言本来自gbookmx
klwkk:能否发给vsprinter控件给我,非常感谢 klwkk@sohu.com
文章分类
收藏
    相册
    我的相册
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 c# 反射的用法收藏

    新一篇: C# 值类型与类的不同 | 旧一篇: c#访问修饰符

    在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,
    今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,
    在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.
    首先我们建立一个类库,将它生成为HelloWorld.dll,
    using System;

     
    namespace Webtest
     
    {

        
    public interface interface1
         
    {
              
    int add();
         
         }

         
    public class ReflectTest:interface1
         
    {
             
             
    public String Write;
             
    private String Writec;

             
    public String Writea
             
    {
                 
    get
                 
    {
                     
    return Write;
                 }

                 
    set
                 
    {
                     Write 
    = value;
                 }

             
             }


             
    private String Writeb
             
    {
                 
    get
                 
    {
                     
    return Writec;
                 }

                 
    set
                 
    {
                     Writec 
    = value;
                 }


             }


              
    public ReflectTest()
              
    {
                  
    this.Write = "Write";
                  
    this.Writec = "Writec";
              }


             
    public ReflectTest(string str1,string str2)
             
    {
                 
    this.Write = str1;
                 
    this.Writec = str2;
             }


             
    public string WriteString(string s,int b)
             
    {
                 
    return "欢迎您," + s + "---" + b; ;
             }


              
    public static string WriteName(string s)
              
    {
                 
    return "欢迎您光临," + s;
              }


             
    public string WriteNoPara()
             
    {
                
    return "您使用的是无参数方法";
             }


             
    private string WritePrivate()
             
    {
                 
    return "私有类型的方法";
             }



             
    public int add()
             
    {
                 
    return 5;
             }

         }

    }
    然后,建立再建立一个项目引入该HelloWorld.dll,
    using System;

    using System.Threading;
    using System.Reflection;


    class Test
    {
        
    delegate string TestDelegate(string value,int value1);

       
    static void Main()
        
    {
            
    //Assembly t = Assembly.LoadFrom("HelloWorld.dll"); 与下面相同的效果
            Assembly t = Assembly.Load("HelloWorld");

    //**********************************************************************     
           foreach (Type aaa in t.GetTypes())
           
    {
                
    //Console.Write(aaa.Name);   //显示该dll下所有的类
            }


    //**********************************************************************
            Module[] modules = t.GetModules();

            
    foreach (Module module in modules)
            
    {
                
    //Console.WriteLine("module name:" + module.Name);//显示模块的名字本例为"HelloWorld.dll"
            }


    //**********************************************************************
            Type a = typeof(Webtest.ReflectTest);//得到具体的类的类型,和下面一个效果
            
    //Type a = t.GetType("Webtest.ReflectTest");//
            
    //Console.Write(a.Name);

    //**********************************************************************
            string[] bb ="aaaa""bbbbb" };
            
    object obj = Activator.CreateInstance(a,bb); //创建该类的实例,后面的bb为有参构造函数的参数
            
    //object obj = t.CreateInstance("Webtest.ReflectTest");//与上面方法相同

    //**********************************************************************        
            MethodInfo[] miArr = a.GetMethods();
            
    foreach (MethodInfo mi0 in miArr)
           
    {
                
    //Console.Write(mi0.Name);  //显示所有的共有方法
           }


    //**********************************************************************
            MethodInfo mi = a.GetMethod("WriteString");//显示具体的方法
            object[] aa={"使用的是带有参数的非静态方法",2};
            
    string s = (string)mi.Invoke(obj,aa); //带参数方法的调用

            MethodInfo mi1 
    = a.GetMethod("WriteName");
            String[] aa1 
    ={"使用的是静态方法"};
            
    string s1 = (string)mi1.Invoke(null, aa1); //静态方法的调用

            MethodInfo mi2 
    = a.GetMethod("WriteNoPara");
            
    string s2 = (string)mi2.Invoke(obj, null); //不带参数的方法调用

            MethodInfo mi3 
    = a.GetMethod("WritePrivate",BindingFlags.Instance | BindingFlags.NonPublic);
            
    string s3 = (string)mi3.Invoke(obj, null); //私有类型方法调用

            
    //Console.Write(s3);

    //**********************************************************************
            PropertyInfo[] piArr = a.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            
    foreach (PropertyInfo pi in piArr)
            
    {
             
    //Console.Write(pi.Name);  //显示所有的属性
            }


    //**********************************************************************
            PropertyInfo pi1=a.GetProperty("Writea");
            
    //pi1.SetValue(obj, "Writea", null);
            
    //Console.Write(pi1.GetValue(obj,null));

            PropertyInfo pi2 
    = a.GetProperty("Writeb", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            pi2.SetValue(obj, 
    "Writeb"null);
            
    //Console.Write(pi2.GetValue(obj, null));

            FieldInfo fi1 
    = a.GetField("Write");
            
    //Console.Write(fi1.GetValue(obj));

    //**********************************************************************
            ConstructorInfo[] ci1 = a.GetConstructors();
            
    foreach (ConstructorInfo ci in ci1)
            
    {
                
    //Console.Write(ci.ToString()); //获得构造函数的形式
            }


            ConstructorInfo asCI 
    = a.GetConstructor(new Type[] typeof(string), typeof(string) });
            
    //Console.Write(asCI.ToString());

    //**********************************************************************
            Webtest.interface1 obj1 = (Webtest.interface1)t.CreateInstance("Webtest.ReflectTest");
            Webtest.ReflectTest obj2 
    = (Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");
            
    //Console.Write(obj1.add());典型的工厂模式

    //**********************************************************************
            foreach (Type tt in t.GetTypes())
            
    {
                
    if (tt.GetInterface("interface1")!=null)
                
    {
                    Webtest.interface1 obj3 
    = (Webtest.interface1)Activator.CreateInstance(a);
                    
    //Console.Write(obj3.add());
                }

            }


    //**********************************************************************
            TestDelegate method = (TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate), obj, "WriteString");
           //动态创建委托的简单例子
            
    //Console.Write(method("str1", 2));

    //**********************************************************************
            ConstructorInfo asCI1 = a.GetConstructor(new Type[0]);
            Webtest.ReflectTest obj5 
    = (Webtest.ReflectTest)asCI1.Invoke(null);
                //
    通过无参构造函数实例化的方法
            
    //Console.Write(obj5.Writea);

            ConstructorInfo asCI2 
    = a.GetConstructor(new Type[] typeof(string), typeof(string) });
              //
    通过有参构造函数实例化的方法
            Webtest.ReflectTest obj6 = (Webtest.ReflectTest)asCI2.Invoke(bb);
            Console.Write(obj6.Writea);
    //**********************************************************************

            Console.Read();
        }
       
    }

    在这里我把我们常用的方法,属性,等全部整理了出来,大家不要嫌弃乱,静下心来,自己按照我的分隔一部分一部分的来,保证你对反射的学习,会事半功倍.当然有关于其方法我会继续补充,想了这么些就先写下来吧.

    发表于 @ 2008年04月15日 16:34:00|评论(loading...)|编辑

    新一篇: C# 值类型与类的不同 | 旧一篇: c#访问修饰符

    评论

    #thornfield_he 发表于2008-04-15 22:50:06  IP: 124.172.167.*
    太感谢了
    #EdisonGG 发表于2008-04-16 09:14:32  IP: 222.35.83.*
    先赞一下!
    #C# 发表于2008-04-16 10:03:43  IP: 121.34.250.*
    studing
    #EdisonGG 发表于2008-04-16 10:43:46  IP: 222.35.83.*
    纠正一下
    delegate string TestDelegate(string value,int value1);
    应为: delegate string TestDelegate(string value,String value1);
    第二个参数应为String 类型 否则绑定失败,建议博主改正一下,小弟才疏学浅,也可能指出有误!
    2008-04-16 14:47:49作者回复
    WriteString"的参数时string,和int型 <br /> public string WriteString(string s,int b)<br /> ...{<br /> return "欢迎您," + s + "---" + b; ;<br /> }<br />所以定义委托一定要 delegate string TestDelegate(string value,int value1);<br />你再测试下看看,同时谢谢你:)
    #ViewStates 发表于2008-04-16 12:34:10  IP: 116.228.61.*
    Good!
    #EdisonGG 发表于2008-04-16 19:54:21  IP: 125.33.195.*
    了解了!~原来是我在看函数的时候看错了~~不好意思~~谢谢赐教!~
    #sheguiwei 发表于2008-04-17 00:05:25  IP: 222.216.69.*
    foreach (PropertyInfo pi in piArr)
    ...{
    //Console.Write(pi.Name); //显示所有的方法
    }
    应为://显示所有属性
    #dupeng0811 发表于2008-07-10 15:49:53  IP: 58.247.147.*
    学习……学习……
    #dupeng0811 发表于2008-07-15 08:54:26  IP: 58.247.235.*
    学习……学习……
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © xiaolei1982