欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 通过反射调用 Func 委托

程序员文章站 2023-10-28 20:05:34
C 通过反射调用 Func 委托 Intro 最近我的 NPOI 扩展库增加了,自定义输出的功能,可以自定义一个 Func 委托来设置要导出的内容,详细介绍请查看 ,通过 Func 可以很方便设置,但是要调用的时候就有点麻烦了 反射调用 获取委托的方法: 获取要执行方法时的target: 委托的方法 ......

c# 通过反射调用 func 委托

intro

最近我的 npoi 扩展库增加了,自定义输出的功能,可以自定义一个 func 委托来设置要导出的内容,详细介绍请查看 ,通过 func 可以很方便设置,但是要调用的时候就有点麻烦了

反射调用

var propertyvalue = property.getvaluegetter<tentity>().invoke(entity);
 var propertytype = typeof(propertysetting<,>).makegenerictype(_entitytype, p.propertytype);
var formatterfunc = propertytype.getproperty("columnformatterfunc")?.getvaluegetter().invoke(setting);

if (null != formatterfunc)
{
    var functype = typeof(func<,,>).makegenerictype(_entitytype, key.propertytype, typeof(object));

    var method = functype.getproperty("method")?.getvaluegetter().invoke(formatterfunc) as methodinfo;
    var target = functype.getproperty("target")?.getvaluegetter().invoke(formatterfunc);

    if (null != method && target != null)
    {
        // apply custom formatterfunc
        // 这里调用方法的时候要注意,method的 invoke 对象是 target
        propertyvalue = method.invoke(target, new[] { entitylist[i], propertyvalue });
    }
}

获取委托的方法:getproperty("method")
获取要执行方法时的target: getproperty("target")

委托的方法是一个 methodinfo 对象,可以转为 methodinfo 对象,然后调用其 invoke 方法,并传递参数等信息

method.invoke(target, new object[]{ parameters });

memo

分享一下,希望对你有帮助~