通过Type.InvokeMethod实现方法的重载

版本:.NET Framework 3.5

先来一个反射调用方法的例子:

using System;
using System.Reflection;

class Example
{
    static void Main()
    {
        Type t = typeof(String);

        MethodInfo substr = t.GetMethod("Substring", 
            new Type[] { typeof(int), typeof(int) });
		// 用MethodBase类的Invoke(object obj, object[] parameters)方法
        Object result = 
            substr.Invoke("Hello, World!", new Object[] { 7, 5 });// 射调用String的Substring(int startIndex, int length)方法
        Console.WriteLine("{0} returned \"{1}\".", substr, result);
    }
}

/* 输出:
System.String Substring(Int32, Int32) returned “World”.
*/

进入正题:通过Type.InvokeMethod实现方法的重载

1)介绍type
Type 为 System.Reflection 功能的根,也是访问元数据的主要方式。使用 Type 的成员获取关于类型声明的信息,如构造函数、方法、字段、属性和类的事件,以及在其中部署该类的模块和程序集。
在多线程方案中,不要锁定 Type 对象以同步对 static 数据的访问。其他不受您控制的代码可能也会锁定您的类类型。这可能会导致死锁。应转而通过锁定私有 static 对象来同步对静态数据的访问。
这个类是线程安全的;多个线程可以同时从此类型的一个实例读取数据。Type 的实例可表示以下任何类型:

值类型
数组
接口
指针
枚举
构造泛型类型和泛型类型定义
构造泛型类型、泛型类型定义和泛型方法定义的类型实参和类型形参

2)实例

Assembly assembly = Assembly.LoadFrom(sDllName);
Type fType = assembly.GetType(sClassName);
object instance = Activator.CreateInstance (fType);
fType.InvokeMember(“classmethod”,BindingFlags.InvokeMethod,null,instance,sParams);//调用指定实例instance的classmethod方法,sParams为传入参数,数量不固定,达到方法的重载

3)扩展
枚举类BindingFlags各属性含义

Default 不指定绑定标志。
IgnoreCase 指定当绑定时不应考虑成员名的大小写。
DeclaredOnly 指定只应考虑在所提供类型的层次结构级别上声明的成员。不考虑继承成员。
Instance 指定实例成员将包括在搜索中。
Static 指定静态成员将包括在搜索中。
Public 指定公共成员将包括在搜索中。
NonPublic 指定非公共成员将包括在搜索中。
FlattenHierarchy 指定应返回层次结构上的公共静态成员和受保护的静态成员。不返回继承类中的私有静态成员。静态成员包括字段、方法、事件和属性。不返回嵌套类型。
InvokeMethod 指定要调用一个方法。它不能是构造函数或类型初始值设定项。
CreateInstance 指定“反射”应该创建指定类型的实例。调用与给定参数匹配的构造函数。忽略提供的成员名。如果未指定查找类型,将应用 (Instance |Public)。调用类型初始值设定项是不可能的。
GetField 指定应返回指定字段的值。
SetField 指定应设置指定字段的值。
GetProperty 指定应返回指定属性的值。
SetProperty 指定应设置指定属性的值。对于 COM 属性,指定此绑定标志与指定 PutDispProperty 和 PutRefDispProperty 是等效的。
PutDispProperty 指定应调用 COM 对象的 PROPPUT 成员。PROPPUT 指定使用值的属性设置函数。如果属性同时具有 PROPPUT 和 PROPPUTREF,而且需要区分调用哪一个,请使用 PutDispProperty。
PutRefDispProperty 指定应调用 COM 对象的 PROPPUTREF 成员。PROPPUTREF 指定使用引用而不是值的属性设置函数。如果属性同时具有 PROPPUT 和 PROPPUTREF,而且需要区分调用哪一个,请使用 PutRefDispProperty。
ExactBinding 指定提供参数的类型必须与对应形参的类型完全匹配。如果调用方提供一个非空 Binder 对象,则“反射”将引发异常,因为这意味着调用方正在提供的 BindToXXX 实现将选取适当的方法。
SuppressChangeType 未实现。
OptionalParamBinding 返回其参数计数与提供参数的数目匹配的成员集。此绑定标志用于所带参数具有默认值的方法和带变量参数 (varargs) 的方法。此标志应只与 Type.InvokeMember 一起使用。
IgnoreReturn 在 COM interop 中用于指定可以忽略成员的返回值。

举例

using System;
using System.Reflection;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        // type, by omitting the type arguments (but keeping the 
        // comma that separates them, so the compiler can infer the
        // number of type parameters).      
        Type generic = typeof(Dictionary<,>);

        // Create an array of types to substitute for the type
        // parameters of Dictionary. The key is of type string, and
        // the type to be contained in the Dictionary is Test.
        Type[] typeArgs = { typeof(string), typeof(int) };

        // Create a Type object representing the constructed generic
        // type.
        Type constructed = generic.MakeGenericType(typeArgs);

        //生成一个实例
        object dicData = Activator.CreateInstance(constructed);

        object[] args = new object[2];       //key-value
        args[0] = "name";  
        args[1] = 1;

        constructed.InvokeMember("Add", BindingFlags.Default | BindingFlags.InvokeMethod,null, dicData, args);
        Dictionary<string, int> dicDT = dicData as Dictionary<string, int>;
        foreach (var data in dicDT)
        {
            Console.WriteLine("Key = {0}, Value = {1} ", data.Key, data.Value);
        }

        Console.ReadKey();
    }
}

转载:https://www.cnblogs.com/snake-hand/p/3143075.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值