有没有办法获得 typeof Func

2024-04-03

简洁版本 :

我们可以得到typeofFunc<T,T> using:

typeof(Func<,>) 

但如果我想得到类型怎么办Func<T, bool>,我应该使用什么,或者可以做什么?显然这不能编译:

typeof(Func<, bool>)

长版:

考虑以下场景,我有两个类似的方法,我想得到第二个(Func<T, int>)使用反射:

public void Foo<T>(Func<T, bool> func) { }

public void Foo<T>(Func<T, int> func) { }

我正在尝试这个:

 var methodFoo = typeof (Program)
            .GetMethods()
            .FirstOrDefault(m => m.Name == "Foo" &&
                        m.GetParameters()[0]
                        .ParameterType
                        .GetGenericTypeDefinition() == typeof (Func<,>));

但由于泛型类型定义Func<T, bool> and Func<T, int>相等它给了我第一种方法。为了解决这个问题,我可以执行以下操作:

var methodFoo = typeof (Program)
            .GetMethods()
            .FirstOrDefault(m => m.Name == "Foo" &&
                        m.GetParameters()[0]
                        .ParameterType
                        .GetGenericArguments()[1] == typeof(int));

然后我得到了正确的方法,但我不喜欢这种方式。对于更复杂的情况来说,这似乎是一种开销。我想做的是获取类型Func<T,bool>就像我上面失败的尝试一样,我可以使用而不是使用 Linq这种超载 http://msdn.microsoft.com/en-us/library/5fed8f59(v=vs.110).aspx of GetMethod并执行如下操作:

var methodFoo = typeof (Program)
            .GetMethod("Foo", 
            BindingFlags.Public | BindingFlags.Instance,
            null, 
            new[] {typeof (Func<, bool>)}, // ERROR typeof(Func<,>) doesn't work either
            null);

注:当然可以Func<T,T>只是一个例子,问题并不特定于任何类型。


不幸的是,你无法构建一个System.Type部分绑定泛型类型的对象。你这样做的方式(即用GetGenericArguments()[1] == typeof(int))是正确的做法。

如果您需要在多个地方重用它,您可以构建一个辅助扩展方法,该方法采用通用类型定义和数组System.Type对象,并返回true如果有匹配:

static bool IsGenericInstance(this Type t, Type genTypeDef, params Type[] args) {
    if (!t.IsGenericType) return false;
    if (t.GetGenericTypeDefinition() != genTypeDef) return false;
    var typeArgs = t.GetGenericArguments();
    if (typeArgs.Length != args.Length) return false;
    // Go through the arguments passed in, interpret nulls as "any type"
    for (int i = 0 ; i != args.Length ; i++) {
        if (args[i] == null) continue;
        if (args[i] != typeArgs[i]) return false;
    }
    return true;
}

现在你可以像这样重写你的代码:

var methodFoo = typeof (Program)
    .GetMethods()
    .FirstOrDefault(m => m.Name == "Foo" &&
        m.GetParameters()[0]
            .ParameterType
            .IsGenericInstance(typeof(Func<,>), null, typeof(bool))
    );

如果我使用methodFoo.GetParameters()[0].ParameterType,我得到的类型是Func<T, int>所以它肯定是在某个地方建造的

方式T上面是泛型方法的泛型类型参数Foo。由于它不是“任何类型”,因此如果您愿意,您可以构造此类型:

var typeT = methodFoo.GetGenericArguments()[0];
var funcTbool = typeof(Func<,>).MakeGenericType(typeT, typeof(bool));

问题是typeT绑定到特定的泛型方法,使得funcTbool类型不适合跨多个独立的泛型方法进行搜索。

If T是该方法所属类的类型参数,例如

class FooType<T> {
    public void Foo(Func<T, bool> func) { }
    public void Foo(Func<T, int> func) { }
}

你将能够构建一个funcTbool基于FooType<>的泛型类型参数,并在不同的签名中搜索它Foo(...)方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法获得 typeof Func ? 的相关文章

随机推荐

  • 在 Android 上如何从位图获取 RGB 值?

    我想在 Android 上获取位图的 RGB 值 但目前还无法做到这一点 我的目标是获取位图每个像素的 RGB 值 Android 或其他有什么特定的功能吗 我也想知道我需要colorMatrix 功能 这对我的项目非常重要 这可能有点晚了
  • Xamarin.Forms;在屏幕上显示设备上我的 SIM 卡的电话号码

    我想在屏幕上显示我设备的电话号码 在 Xamarin Android 中 代码可以正常工作 但我想使用 Xamarin Forms 中的代码 我已经搜索过 但没有找到任何结果 Android Telephony TelephonyManag
  • 下划线作为 JavaScript 变量?

    In 这个帖子 https stackoverflow com questions 3504499 how to copy table row with clone in jquery and create new unique ids f
  • CMAKE_*_OUTPUT_DIRECTORY 的正确使用

    前言 我是only谈论本地编译 not关于安装项目 这是因为我还没有对适当的研究进行足够的研究install使用 CMake 但如果我的问题直接涉及到 请插话install实践 似乎有可能 TL DR 你在什么场景下not想要将所有正在构建
  • React 中未使用 ES6 fetch 定义 fetch 方法

    我在我的第一个 React js 应用程序中遇到了 fetch 函数的问题 这是我的项目的结构 hello world app components main jsx node modules public build js index h
  • 编写 HTML 电子邮件时的最佳实践和注意事项 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我开发网站已有十多年了 但很快发现我的许多网络开发习惯在为电子邮件客户端开发时毫无用处 这让我非常沮丧 所以我想问一个问题 对于像我这样不时为
  • React-Leaflet:将地图控制组件放置在地图之外?

    这是我的其他问题的更普遍的版本 从反应传单中的地图中删除缩放控制 https stackoverflow com questions 59432189 remove zoom control from map in react leafle
  • Python 3 和 Tkinter 有缺陷且缓慢

    因此 几个月前 我制作了一个小型 GUI 用于在我正在运行的角色扮演活动中处理 NPC 从那以后我就再也没有接触过 只是现在我需要它 明天 事实上 我有一些奇怪的错误 加载 GUI 似乎工作正常 但是当我开始按下按钮时 麻烦就开始了 起初
  • Git 合并并修复具有两个分支的混合空间和选项卡

    我已经经历了一些类似的 SOQ 但没有找到适合这种情况的适当解决方案 我注意到在许多文件中 用于缩进的制表符和空格混杂在一起 目前我们遵循的编码标准使用 4 个空格作为制表符 虽然这个问题应该在发生时就得到解决 但我现在需要考虑它 并希望修
  • 广播接收器在 Android 6.0 Marshmallow 中不工作

    我刚刚将我的 Nexus 5 更新到 android 6 到目前为止我的应用程序工作正常 但现在广播接收器无法工作 新版本有什么变化吗 这是我尝试过的代码 它适用于以前的版本 但不适用于棉花糖 安卓清单
  • 如何识别模板参数是否为 std::complex?

    如何判断模板参数是否为std complex 我想要一个支持所有数据类型 如 float double int 等 的通用方法 我知道使用 std is same 我可以专门检查给定类型 例如 std complex
  • 使用 System.Text.Json 自定义可选属性的 JSON 序列化器

    我正在尝试实现一个处理两者的 JSON 序列化机制null和缺失的 JSON 值 以便能够在需要时执行部分更新 这样当值缺失时它不会触及数据库中的字段 但当值显式设置为时它会清除它 null 我创建了一个从 Roslyn 复制的自定义结构O
  • 从另一个 Jenkins 管道构建一个 Jenkins 管道时覆盖默认参数

    目标 当我从另一个 Jenkins 脚本构建时 用 false 覆盖 Jenkins 布尔参数默认值 true 我已经检查了其他 StackOverflow 项目中建议的可能答案 似乎没有什么匹配的 然而 他们确实向我展示了如何在从另一个
  • 使用 Apache httpclient 进行 https

    我已经在 tomcat 中启用了 https 并拥有用于服务器身份验证的自签名证书 我使用 Apache httpClient 创建了一个 http 客户端 我已经设置了一个加载服务器证书的信任管理器 http客户端可以毫无问题地与服务器连
  • 在 XML 中设置微调器模式

    在代码中定义微调器时 可以将模式设置为 对话框 或 下拉 Spinner Context上下文 int模式 使用给定上下文的主题和提供的显示选项模式构造一个新的微调器 但在 XML 中定义布局时我找不到此选项 我是否错过了它 或者这在 XM
  • 调试会话

    作为性能测试的一部分 我需要调试会话等 如果我删除 则会运行相同的代码session gt 当我添加它时 它说模拟期间没有发送任何请求 因为它没有发送任何请求 val scn1 scenario LaunchAction exec sess
  • 有效电子邮件地址的最大长度是多少?

    有效电子邮件地址的最大长度是多少 它有任何标准定义吗 电子邮件地址不得超过254人物 IETF 接受了以下内容 可以对任何给定地址进行全面诊断online http isemail info RFC 3696 的原始版本将 320 描述为最
  • 一元加运算符在 Excel 公式中起什么作用?

    这个看似微不足道的操作在公式中的许多情况下都非常有用 A 否则会引发错误的函数 QUOTIENT A1 A3 4 WORKDAY A1 A3 7 B 将范围转换为数字 即任何文本为零 N A1 C3 C 返回来自不同工作表的混合数据数组 C
  • 无效的流标头:2C6D0005 - StreamCorruptedException

    我从 servlet 应用程序下载了一个序列化的 Java 对象 当我尝试用 Java 代码打开它时 我得到 java io StreamCorruptedException 无效的流标头 2C6D0005 我搜索了互联网 但找不到任何代码
  • 有没有办法获得 typeof Func

    简洁版本 我们可以得到typeofFunc