C#基础概念二十五问(7)

24.params 有什么用?

答:

params 关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力

它在只能出现一次并且不能在其后再有参数定义,之前可以

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication1
{
    class App
     {
        //第一个参数必须是整型,但后面的参数个数是可变的。
        //而且由于定的是object数组,所有的数据类型都可以做为参数传入
        public static void UseParams(int id, params object[] list)
         {
             Console.WriteLine(id);
            for (int i = 0; i < list.Length; i++)
             {
                 Console.WriteLine(list[i]);
             }
         }
 
        static void Main()
         {
            //可变参数部分传入了三个参数,都是字符串类型
             UseParams(1, "a", "b", "c");
            //可变参数部分传入了四个参数,分别为字符串、整数、浮点数和双精度浮点数数组
             UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });
 
             Console.ReadLine();
         }
     }
}

结果:
1
a
b
c
2
d
100
33.33
System.Double[]


25.什么是反射?

答:

反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件

通过对类型动态实例化后,还可以对其执行操作

简单来说就是用string可以在runtime为所欲为的东西,实际上就是一个.net framework内建的万能工厂

一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。)

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example25Lib
{
    public class Class1
     {
        private string name;
        private int age;
 
        //如果显式的声明了无参数构造函数,客户端只需要用程序集的CreateInstance即可实例化该类
        //在此特意不实现,以便在客户调用端体现构造函数的反射实现
        //public Class1()
        //{
        //}
        public Class1(string Name, int Age)
         {
             name = Name;
             age = Age;
         }
        public void ChangeName(string NewName)
         {
             name = NewName;
         }
        public void ChangeAge(int NewAge)
         {
             age = NewAge;
         }
        public override string ToString()
         {
            return string.Format("Name: {0}, Age: {1}", name, age);
         }
     }
}

反射实例化对象并调用其方法,属性和事件的反射调用略去

using System;
using System.Collections.Generic;
using System.Text;
 
//注意添加该反射的命名空间
using System.Reflection;
 
namespace Example25
{
    class Program
     {
        static void Main(string[] args)
         {
            //加载程序集
             Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");
 
            //遍历程序集内所有的类型,并实例化
             Type[] tmpTypes = tmpAss.GetTypes();
            foreach (Type tmpType in tmpTypes)
             {
                //获取第一个类型的构造函数信息
                 ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
                foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)
                 {
                    //为构造函数生成调用的参数集合
                     ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters(); 
                    object[] tmpParams = new object[tmpParamInfos.Length];
                    for (int i = 0; i < tmpParamInfos.Length; i++)
                     {
                         tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
                        if (tmpParamInfos[i].ParameterType.FullName == "System.String")
                         {
                             tmpParams[i] = "Clark";
                         }
                     }
 
                    //实例化对象
                    object tmpObj = tmpConsInfo.Invoke(tmpParams);
                     Console.WriteLine(tmpObj);
 
                    //获取所有方法并执行
                    foreach (MethodInfo tmpMethod in tmpType.GetMethods())
                     {
                        //为方法的调用创建参数集合
                         tmpParamInfos = tmpMethod.GetParameters();
                         tmpParams = new object[tmpParamInfos.Length];
                        for (int i = 0; i < tmpParamInfos.Length; i++)
                         {
                             tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
                            if (tmpParamInfos[i].ParameterType.FullName == "System.String")
                             {
                                 tmpParams[i] = "Clark Zheng";
                             }
                            if (tmpParamInfos[i].ParameterType.FullName == "System.Int32")
                             {
                                 tmpParams[i] = 27;
                             }
                         }
                         tmpMethod.Invoke(tmpObj, tmpParams);
                     }
 
                    //调用完方法后再次打印对象,比较结果
                     Console.WriteLine(tmpObj);
                 }
             }
 
             Console.ReadLine();
         }
     }
}

结果:
Name: Clark, Age: 0
Name: Clark Zheng, Age: 27

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值