[No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
class test
{
    public void Method()//1
    {
        Console.WriteLine("1:__" + "Method调用成功!");
    }
    public void Method(string str)//2
    {
        Console.WriteLine("2:__" + str);
    }

    public string Method(string str1, string str2)//3
    {
        string className1 = this.GetType().FullName;//非静态方法中获取类名
        string className2 = MethodBase.GetCurrentMethod().ReflectedType.FullName;//静态方法中的获取类名
        Console.WriteLine("3:__;类名"+className1+"_"+ className2);
        return "3:__" + str1 + str2;
    }
}
class Program
{
    public static void run(string testcase)
    {
        string strClass = "test";  //命名空间+类名
        string strMethod = "Method";//方法名

        Type type;
        object obj;

        type = Type.GetType(strClass);//通过string类型的strClass获得同名类“type”
        obj = System.Activator.CreateInstance(type);//创建type类的实例 "obj"

        MethodInfo method = type.GetMethod(strMethod, new Type[] { });//取的方法描述//通过string类型的strMethod获得同名的方法“method”//1
        method.Invoke(obj, null);//type类实例obj,调用方法"method"//1

        method = type.GetMethod(strMethod, new Type[] { typeof(String) });//取的方法描述//2
        object[] objs = new object[] { testcase };
        method.Invoke(obj, objs);//t类实例obj,调用方法"method(testcase)"//2

        method = type.GetMethod(strMethod, new Type[] { typeof(String), typeof(String) });//取的方法描述//2
        var result = (string)method.Invoke(obj, new object[] { "a", "b" });//3
        Console.WriteLine(result);//3

        //string className = this.GetType().FullName;
        string className = MethodBase.GetCurrentMethod().ReflectedType.FullName;//静态方法中的获取类名
        Console.WriteLine(className);
        Console.ReadKey();
    }
    static void Main(string[] args)
    {
        string testcase = "测试呀";//自己定义的类
        run(testcase);
    }
}
时间: 2024-10-09 03:07:04

[No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法的相关文章

Java反射:根据方法名动态调用方法,解决商品动态属性取值问题。

public class Goods{ private String goodsName; private String attr1; private String attr2; private String attr3; private String attr4; ......... private String attr20; setter/getter方法 } 在数据库表goods中,已知该商品的属性个数N(满足:N=5,attr1—attr5有值,attr6-attr20为空).问如何取

使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法

Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法 获取Class类实例的方法: 类名.class 实例名.getClass() Class.forName(className) public class RefTest { @Test public void testRef(){ //Class cls = RefTest.class; //Class.forName("com.jboa.service.RefTest"); //new RefTest()

使用反射和泛型,动态读取XML创建类实例并赋值

[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能.网上的例子倒也不少,但总是觉得缺点什么.比如读取xml文件之后该如何处理?看到的文章基本上都是手动创建一个目标类的实例,然后手动从读取的XML文件的内容中给刚才创建的目标类实例相关字段赋值.缺点什么呢?对嘞,感觉上

自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能.网上的例子倒也不少,但总是觉得缺点什么.比如读取xml文件之后该如何处理?看到的文章基本上都是手动创建一个目标类的实例,然后手动从读取的XML文件的内容中给刚才创建的目标类实例相关字段赋值.缺点什么呢?对嘞,感觉上不够简单和智能. 正所谓驱动科技发展的原因就是懒,为了使我们的小工具能够傻瓜到只需要

Python中动态创建类实例

Python中动态创建类实例 简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块.如下: def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_n

域初始化、静态块及构造方法等在创建类实例时的执行顺序(转载)

在<Core java 2: volumn 1, Edition 5>一书的第四章“对象与类”中讲到域赋值语句.实例块.静态块及构造方法等在创建类实例时的执行顺序,中文译本有些处翻译的不贴切,而英文原书中也有一处错误.本文通过一个小程序来说明类实例构造过程中的语句执行顺序. 程序如下: public class Teststaticblock { public Teststaticblock() { this("second"); System.out.println(&q

java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析

/** *   栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放  在常量池中). 堆(heap):存放所有new出来的对象. *   静态存储:存放静态成员(static定义的). 常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float.int等).另外,可以存储不经常改变的东西 *                       p

C# 反射 通过类名创建类实例

“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)");

通过类名称(字符串)创建类实例

首先要在 initialization 区域注册要创建的类 RegisterClass(TYourClass); 然后在运行期使用如下代码创建 TYourClass 类的实例. procedure Txxx.xxxx;var cls: TPersistentClass; ys: TYourClass;begin cls := GetClass('TForm2'); ys := TYourClass(cls.NewInstance).Create(xxx); ys.xxxx;end;