前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#笔记:反射的简单用法

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

作者头像
超级大猪
发布2019-11-22 09:46:25
3740
发布2019-11-22 09:46:25
举报
文章被收录于专栏:大猪的笔记

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

代码语言:javascript
复制
public class TestRef
    {
        string testStr = "";
        public TestRef(string testStr)
        {
            this.testStr = testStr;
        }
        public void Print()
        {
            Console.WriteLine(testStr);
        }
    }

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

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

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

代码语言:javascript
复制
 MethodInfo met = t.GetMethod("Print");
met.Invoke(tr,null);

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

代码语言:javascript
复制
var instence =   Assembly.Load("XXX.dll").CreateInstance("xxxxxx");

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

代码语言:javascript
复制
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 中的代码。

代码语言:javascript
复制
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);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-02-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档