c#反射 订阅
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。 [1] 展开全文
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。 [1]
信息
类    别
程序设计语言
影响语言
C++、C#、D、Java、JavaScript、ObjectPHP等
创始时间
1972年
主要编译器
Visual C++、Clang、GCC、Turbo C等
中文名
C语言
创始人
Dennis MacAlistair Ritchie
发    源
BCPL语言
外文名
C Programming Language
c语言简介
C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%~20%。因此,C语言可以编写系统软件。 [2]  当前阶段,在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。计算机系统设计以及应用程序编写是C语言应用的两大领域。同时,C语言的普适较强,在许多计算机操作系统中都能够得到适用,且效率显著。 [3]  冯.诺依曼在1945年提出了现代计算机的若干思想,被后人称为冯.诺依曼思想,这是计算机发展史上的里程碑。自1945 年至今大多采用其结构,因此冯.诺依曼被称为计算机之父。他的体系结构计算机由运算器、控制器、存储器、输入设备、输出设备五大部件构成。 C语言拥有一套完整的理论体系经过了漫长的发展历史,在编程语言中具有举足轻重的地位。 [4] 
收起全文
精华内容
下载资源
问答
  • C#反射

    2021-02-02 16:49:06
    C#反射之方法 反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象; 在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法获取此类型支持的方法列表;该方法的两种形式: MethodInfo [] ...

    C#反射之方法

    反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象;

    在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法获取此类型支持的方法列表;该方法的两种形式:

    MethodInfo [] GetMethods()

    MethodInfo [] GetMethods(BindingFlags bindingflas) :它的参数带有一些限制 BindingFlags 是一个枚举

    枚举成员 [DeclaredOnly,Instance ,Public] 枚举成员的功能使用

    ParameterInfo[] GetParameters() 方法返回一个方法的参数列表

    方法

    获取类中所有的方法

    class TestClass
        {
            public int Test1( string test1,int test2) {
                Console.WriteLine("test call {0} {1}",test1,test2); 
                return 0; }
           
            private void Test2() { }
           
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                //通过反射 获取类中的方法
                TestClass testClass = new TestClass();
                //获取到类型 获取到方法
                //BindingFlags.NonPublic   获取非公有方法 | BindingFlags.Instance 搜索当前类的方法  | BindingFlags.DeclaredOnly 只获取我们声明的
                //通过添加参数来指定获取到的方法
    
                MethodInfo[] methodInfo = testClass.GetType().GetMethods(BindingFlags.DeclaredOnly); 
                //对方法进行输出
                for (int i = 0; i < methodInfo.Length; i++)
                {
                    Console.WriteLine(" 方法名 : {0} ",methodInfo[i].Name);
                    Console.WriteLine(" 参数 : ",methodInfo[i].GetParameters());
                    for (int j = 0; j < methodInfo[i].GetParameters().Length; j++)
                    {
                        //输出参数名称 类型
                        Console.WriteLine(" 名称 : {0} 类型 : {1} ", methodInfo[i].GetParameters()[j].Name, methodInfo[i].GetParameters()[j].ParameterType);
                    }
    
                    if (methodInfo[i].Name=="Test1")
                    {
                        methodInfo[i].Invoke(testClass, new object[] { "hello", 2 });
                    }
    
                    Console.WriteLine(" 返回值 : {0} 返回类型 : {1} ", methodInfo[i].ReturnParameter.Name,methodInfo[i].ReflectedType);
                }
    
                Console.ReadLine();
            }
        }
    

    获取到指定的方法

     MethodInfo methodInfo= testClass.GetType().GetMethod("Test1");
     methodInfo.Invoke(testClass, new object[] { "hello", 2 });
    

    字段

    class TestClass
        {
            public int filed1;
            private string filed2;
    
            public int Field1
            {
                get
                {
                    return filed1;
                }
            }
    
            private int Field2
            {
                get;
                set;
            }
        }
            
    class Program
        {
            static void Main(string[] args)
            {
                TestClass testClass = new TestClass();
                FieldInfo fieldInfo = testClass.GetType().GetField("filed1");
                testClass.filed1 = 100;
                fieldInfo.SetValue(testClass, 1000);//设置值
                Console.WriteLine(" fieldName {0} fieldType {1} firldValue {2} ",fieldInfo.Name,fieldInfo.FieldType,fieldInfo.GetValue(testClass));
    
                Console.ReadLine();
    
            }
            }
      
        
    

    创建对象

    C#创建对象实例共有三种方法
        (1)通过System.Reflection.Assmbly里方法获得实例,主要根据类的Fullname和构造函数的参数创建实例,包括了私有和公有的,很强大

    public object CreateInstance(string typeName);//使用区分大小写的方式找到指定的类型名称,FullName,
    public object CreateInstance(string typeName, bool ignoreCase);//使用指定的类型名称,FullName,是否区分大小写由参数决定

    //使用多种参数,binder为Null,不知道什么东西,args为构造函数的参数,culture和activation可以为null,不知道什么东西
    public virtual object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes);

    //创建实例的例子:
    var obj = Assembly.LoadFrom(@“D:\应用软件\VS2017\C#\WindowsFormsApp16\ClassLibrary1\bin\Debug\ClassLibrary1.dll”).CreateInstance(参数)
    (2)采用System.Activator里静态方法CreateInstance获得对应的实例

    public static object CreateInstance(Type type);//根据公有的无参的构造函数创建对象实例
    public static object CreateInstance(Type type, bool nonPublic);//如果公共或非公共默认构造函数都可以匹配,则为 true;如果只有公共默认构造函数可以匹配,则为 false。
    public static object CreateInstance(Type type, object[] args, object[] activationAttributes);//args为构造函数的参数
    public static object CreateInstance(Type type, params object[] args);
    public static object CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture);
    public static object CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes);

    public static ObjectHandle CreateInstance(string assemblyName, string typeName);
    public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttributes);

    展开全文
  • C# 反射

    2018-08-04 21:45:36
    http://www.cnblogs.com/binfire/archive/2013/01/17/2864887.html C# 反射机制 https://blog.csdn.net/sibaison/article/details/70168338 C#装配件 https://bbs.csdn.net/topics/60376191 程序集与装配件是不是同...

    参考以下文章:
    http://www.cnblogs.com/binfire/archive/2013/01/17/2864887.html C# 反射机制
    https://blog.csdn.net/sibaison/article/details/70168338 C#装配件
    https://bbs.csdn.net/topics/60376191 程序集与装配件是不是同一个概念
    https://www.cnblogs.com/CHNMurphy/p/8607752.html C# 中使用反射的优缺点
    https://www.cnblogs.com/weloveshare/p/5754553.html c# 早绑定晚绑定
    https://bbs.csdn.net/topics/391968018 为什么反射效率那么低?

    编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。元数据是编译以后的最基本数据单元,就是一大堆的表。

    反射:审查元数据并收集关于它的类型信息的能力。这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,

    System.reflection命名空间包含的几个类,允许你通过反射获得这些元数据表的信息。
    System.Reflection.Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。(编译好的程序是由多个装配件组成,每个装配件里都包含了元数据,元数据中就存储了自描述信息,如接口、类型、方法等细节,分别描述每个装配件的内容,并可以判断装配件是否装满,还可调用其它装配件的信息。.NET运行时就会加载这个程序装配件,并利用装配件的自描述功能来验证装配件程序的合法性,合法才运行。)
    System.Type类可以获得对象的类型信息,包括:方法、构造器、属性等。
    System.Reflection.MethodInfo包含方法的信息,包括:方法的名称、参数、返回值等。

    反射的优点:
    反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
    反射的缺点:
    性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因为反射是要动态的获取实例调用方法,这就要消耗资源去查找和计算。反射的过程中有递归和遍历的操作,这些都需要时间。     
    模糊程序的内部逻辑:反射代码比相应的直接代码更复杂,因而会带来维护问题。程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术。

    早绑定 early binding:这种方式运行效率高.
    在编译的时候就已经却确定了将来程序运行基类或者派生类的哪个方法。
    在编译代码的时候根据引用类型就决定了运行该引用类型中定义的方法。即基类方法。

    晚绑定 late binding:
    只有在运行的时候才能决定运行基类或者派生类中的方法,C#中用new和override实现了晚绑定。
    运行的时候将根据该实际类型,而不是引用类型来调用相应的方法,即取决于我们new了什么对象。

    动态绑定 dynamic binding
    dynamic声明变量的好处是,编译器在编译时并不知道它引用对象的确切类型,而要到运行时才知道。因此,我们可以通过动态绑定在运行时来操作一些类型的属性、方法等。

    DLR(动态语言运行时)使得C#中可以调用动态语言以及使用dynamic的动态类型。它允许添加动态语言,如ruby python。

    为什么使用反射?
    通俗的说,反射可以使用未知的dll。
    你直接引用DLL,那是静态的,一旦改变DLL,就必须重新编译,生产新的软件,但是动态引用DLL就不需要。
    反射可以用来开发程序插件一类的,别人开发的插件只要继承某个已知的接口,就可以利用反射动态加载进来,然后实例化接口调用,就可以载入别人的插件了。猜想,不开源的插件使用,那为什么不直接使用命名空间呢?
    你提供接口别人提供这个接口的实现,但是不给你源码不给你方法说明,那么这个时候你就只有用反射调用它的实现,以接口形式来使用了。常见的IOC就是这样组织人民这样干的东西。
    就举一个例子吧,如果程序中某个地方需要实例化整个程序中所以继承某接口的类,这个时候难道你要去程序中找到所有符合条件的类再实例化?而反射就可以很好的解决这个问题。
    dll各种版本的变化,你不可能每次都编译成同一个版本,这样管理会混乱。
    这样子也是一种很好的我解藕方式,你如果dll很庞大,引用进工程是不会很方便的。

    https://bbs.csdn.net/wap/topics/390584105 C# 为什么要用反射,什么情况必须使用反射。
    https://bbs.csdn.net/topics/390149930 C#中使用反射的意义?为什么要使用反射

    具体操作如下:

    http://www.cnblogs.com/dw039/p/7476011.html C# 反射、与dynamic最佳组合
    https://blog.csdn.net/lianjiangwei/article/details/47207875【C#】:浅谈反射机制
     

    1,拿到需要的类型,创建对象,操作变量,调用函数。
    2,如何拿到需要的类型?如果需要的类型是内部的,是确定的,那就不需要加载程序集,直接使用就行,如果是外部的,或者是不确定的,则需要加载相应的程序集。
    3,无论如何,我们需要的不过就是能创建对象,调用函数,操作变量。

    //加载DLL,如果是内部的,就不需要加载dll
    Assembly ass = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory+"bin\\WebApplication1.dll");
    //获得类型,如果是确定的,直接使用该类型就好,如果是不确定,一般通过string参数来传递该类型
    Type t = ass.GetType("WebApplication1.MainPage");
    //创建实例对象,使用var会更加方便
    object o = Activator.CreateInstance(t);
    //操作变量
    t.GetProperty("Age").SetValue(instance, 18, null);
    //调用方法
    MethodInfo mi = t.GetMethod("RunJs1");   mi.Invoke(o, null});
    //使用dynamic动态类型,直接拿到对象,调用方法
    dynamic dy = Activator.CreateInstance(t); dy.RunJs1();

    使用反射实现工厂模式如下:

    using System.Reflection;

    public class ReceiveTest : MonoBehaviour
    {
        public void CallFun(string name)
        {
            dynamic tmp = Activator.CreateInstance(Type.GetType(name));//根据name来决定使用哪个对象实例
            tmp.Fun();
        }
    }

    public interface IFruitTest
    {
        void Fun();
    }

    public class AppleTest : IFruitTest
    {
        public void Fun()
        {
            Debug.Log("AppleTest Fun");
        }
    }

    public class OrangeTest : IFruitTest
    {
        public void Fun()
        {
            Debug.Log("OrangeTest Fun");
        }
    }

     

     

     

     

     

     

     

     

    展开全文
  • c#反射

    2018-03-19 14:00:00
    C#反射: 反射指程序可以访问,检测和修改它本身状态和行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集,模块和类型的对象。 功能: 可以使用反射动态的创建...
    C#反射:
        反射指程序可以访问,检测和修改它本身状态和行为的一种能力。
        程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集,模块和类型的对象。
    
        功能:
        可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法和访问其字段和属性。
    
        用途:
        1.它允许在运行时查看特性(attribute)信息。
        2.它允许审查集合中的各种类型,以及实例化这些类型。
        3.它允许延迟绑定的方法和属性(property)。
        4.它允许在运行时创建新类型,然后使用这些类型执行一些任务。

     

    转载于:https://www.cnblogs.com/0315cz/p/8601629.html

    展开全文
  • C#反射小结C#反射小结C#反射小结C#反射小结C#反射小结C#反射小结C#反射小结
  • C# 反射.zip C# 反射.zip

    2019-11-13 18:14:23
    C# 反射.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,971
精华内容 3,588
关键字:

c#反射

c# 订阅