专栏首页大猪的笔记C#笔记:反射的简单用法

C#笔记:反射的简单用法

反射其实说白了就是,当你知道类的名字和位置。你可以在程序运行时直接创建实例调用它。没什么大不了的。

public class TestRef
    {
        string testStr = "";
        public TestRef(string testStr)
        {
            this.testStr = testStr;
        }
        public void Print()
        {
            Console.WriteLine(testStr);
        }
    }

1、这里有一个测试类,有它的构造函数和一个测试的函数。我们现在通过反射来获取它的实例。

Type t = Type.GetType("反射.TestRef");//“反射”是命名空间
 object[] o = new object[] { "hello" };
 TestRef tr = (TestRef)Activator.CreateInstance(t, o);
tr.Print();

 2、如果只需要获取一个函数,我们也能这么做。

 MethodInfo met = t.GetMethod("Print");
met.Invoke(tr,null);

3、如果你需要创建一个DLL文件中的实例。你可以这么做 

var instence =   Assembly.Load("XXX.dll").CreateInstance("xxxxxx");

4、通过一个string的名字找到它的值。

class Program
 { 
     public static string doc1 = "hello world";//获取的对象必须是要客观存在的。
//   ....................省略号          
    string docname = "doc1";
    //通过反射获取该对象,必须为public
    FieldInfo myRef = typeof(Program).GetField(docname);
    string doc = (string)myRef.GetValue(null);
}

5、好了。下面来玩一个高端的。动态编译一个String 中的代码。

string code = @"
        using System;
        namespace MyNamespace
        {
          public class MyClass
          {
            private string name;
            public MyClass(string name)
            {
              this.name = name;
            }
            public void Test()
            {
              Console.WriteLine(""{0} - {1}"", name, DateTime.Now);
            }
          }
        }
      ";
            // 创建编译器对象
            CSharpCodeProvider complier = new CSharpCodeProvider();         
            // 设置编译参数
            CompilerParameters options = new CompilerParameters();
            options.ReferencedAssemblies.Add("System.dll");
            options.GenerateInMemory = true;
            options.OutputAssembly = "MyTest";
            // 开始编译
            CodeSnippetCompileUnit cu = new CodeSnippetCompileUnit(code);
            CompilerResults cr = complier.CompileAssemblyFromDom(options, cu);
            // 执行动态程序集相关内容。当然还是反射。
            Type t2 = cr.CompiledAssembly.GetType("MyNamespace.MyClass");
            object o2 = cr.CompiledAssembly.CreateInstance("MyNamespace.MyClass", false, BindingFlags.Default,
              null, new object[] { "Tom" }, CultureInfo.CurrentCulture, null);
            t2.InvokeMember("Test", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
              null, o2, null);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ubuntu设置中文字体

    超级大猪
  • C#笔记:重构-模版模式

    在重构中,我们需要对代码不同但是结构相同的函数进行合并。我们可以把函数中不同的步骤都封装成一个个不同的函数,然后作为抽象函数上移到父类,父类用统一的函数进行调用...

    超级大猪
  • 使用docker部署谷歌镜像

    超级大猪
  • asp.net web api 构建api帮助文档

    1 概要 创建ASP.NET Web Api 时模板自带Help Pages框架。 2 问题 1)使用VS创建Web Api项目时,模板将Help Pages框...

    甜橙很酸
  • 我使用的Unity开发多语言处理方案

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering
  • WCF学习笔记 2

    在学习WCF的ABCB之前,我们先创建一个NetNamedPipeBinding绑定方式的服务。

    小蜜蜂
  • Visual Studio 2015速递(1)——C#6.0新特性怎么用

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS20...

    葡萄城控件
  • 【已解决】Xcode代码提示变量为Error Type

    我之前使用Masonry布局时候经常需要设置偏移量,但是呢在设置布局哪里设置死数据不方便进行调试更换就想用一个变量。

    君赏
  • 简单易学的机器学习算法——谱聚类(Spectal Clustering)

        网络簇结构(network cluster structure)也称为网络社团结构(network community structure),是复杂网...

    zhaozhiyong
  • 状态模式

    状态模式允许在内部状态时改变它的行为,在外部看起来好像修改了类。状态模式可以延伸出状态机的概念,状态机据我自己所知在电商系统中用来控制订单状态的流转。关于状态机...

    shysh95

扫码关注云+社区

领取腾讯云代金券