美文网首页.NETAmazing .NETdotNET
C#通过反射调用 Func 委托

C#通过反射调用 Func 委托

作者: 天天向上卡索 | 来源:发表于2019-08-02 18:05 被阅读11次

C# 通过反射调用 Func 委托

Intro

最近我的 NPOI 扩展库增加了,自定义输出的功能,可以自定义一个 Func 委托来设置要导出的内容,详细介绍请查看 https://www.jianshu.com/p/5b14cd1bcb8f,通过 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

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

相关文章

  • C#通过反射调用 Func 委托

    C# 通过反射调用 Func 委托 Intro 最近我的 NPOI 扩展库增加了,自定义输出的功能,可以自定义一个...

  • C#中通过反射调用委托

    今天突然有需求需要通过反射调用指定对象的委托方法,但是搜了半天也没找到相关的资料。后台终于在国外论坛发现了解决方法...

  • 9012年了,别说java反射慢了

    java 反射 java反射 调用 通过Method.invoke 委托给sun.reflect.MethodAc...

  • 10-30学习总结

    今天学习了C#第四章委托的实例化和调用 调用: 委托实例名(实参列表); 通过委托对象的名称(后面跟着要传递给委托...

  • C#中的Action<>和Func<>的

    用过C#的委托的同学都是这Action<> 和 Func<>都是委托【代理】的简写形式!!! 我们先看看定义委托和...

  • C# func and action委托是什么?

    如题: C# func and action委托是什么? 1) 回答这个问题之前,我们需要了解什么是委托(英文 D...

  • C#之Action委托与Func委托

    Action与Func的区别: Action 不能指向有返回值的方法 , 不能有返回值 。Func 可以指向有一个...

  • 目录 - C#

    总目录 C# 第01局:泛型 C# 第02局:反射 C# 第03局:特性 C# 第04局:委托 C# 第05局:事...

  • 「ILRuntime」框架踩坑整理

    协程里的foreach中使用yield return后,foreach遍历会被终止 通过反射调用委托会有问题 只能...

  • Emit,更高级的反射用法(C#)

    只要写过几年C#,你就不可能没用过反射。 如果要通过反射调用函数,最广泛的用法是使用Invoke。 比Invoke...

网友评论

    本文标题:C#通过反射调用 Func 委托

    本文链接:https://www.haomeiwen.com/subject/nqjgrctx.html