查找使用特定 T 类型实现某个通用接口的所有类型

2024-06-23

我有几个类继承自abstract class BrowsingGoal。其中一些实现了一个名为的接口ICanHandleIntent<TPageIntent> where TPageIntent: PageIntent.

举一个具体的例子:

public class Authenticate : BrowsingGoal, ICanHandleIntent<AuthenticationNeededIntent>
{
    ...
}

现在我想扫描 CurrentDomain 的程序集以查找实现ICanHandleIntentAuthenticationNeededIntent。这是我到目前为止所拥有的,但似乎没有找到任何东西:

protected BrowsingGoal FindNextGoal(PageIntent intent)
{
    // Find a goal that implements an ICanHandleIntent<specific PageIntent>
    var goalHandler = AppDomain.CurrentDomain
        .GetAssemblies()
        .SelectMany(assembly => assembly.GetTypes())
        .FirstOrDefault(t => t.IsAssignableFrom((typeof (BrowsingGoal))) &&
                                t.GetInterfaces().Any(x =>
                                    x.IsGenericType &&
                                    x.IsAssignableFrom(typeof (ICanHandleIntent<>)) &&
                                    x.GetGenericTypeDefinition() == intent.GetType()));

    if (goalHandler != null)
        return Activator.CreateInstance(goalHandler) as BrowsingGoal;
}

一些帮助将不胜感激!


这个条件是不正确的:

x.IsAssignableFrom(typeof(ICanHandleIntent<>))

实现通用接口实例的类型不能从通用接口定义本身分配,这ICanHandleIntent<>代表。

你想要的是

x.GetGenericTypeDefinition() == typeof(ICanHandleIntent<>)

对类型参数的检查也是错误的。它应该是

x.GetGenericArguments()[0] == intent.GetType()

因为您正在寻找类型参数,即通用名称后面的三角括号中的类型。

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

查找使用特定 T 类型实现某个通用接口的所有类型 的相关文章

  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • Java Reflection:为什么这么慢?

    我一直避免使用 Java 反射 因为它速度缓慢 我在当前项目的设计中达到了一个点 能够使用它将使我的代码更具可读性和优雅性 所以我决定尝试一下 我只是对这种差异感到惊讶 我注意到有时运行时间几乎延长了 100 倍 即使在这个简单的例子中 它
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 简单的喷射器将具体类型与生活方式结合起来

    我正在寻找一种可以使用指定的生活方式注册具体类型的方法 基本上如下所示 public void SomeFunction Type concrete Lifestyle lifestyle gt container Register con
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I
  • 从亚马逊 s3 流式传输文件

    我在尝试从 amazon s3 流式传输文件时遇到问题 基本上 我的文件存储在 amazom s3 上 我无法提供对这些文件的直接访问 因为用户需要进行身份验证 我正在尝试找到一种流式传输文件的方法 而无需将每个文件从亚马逊下载到我的服务器
  • 上传并 POST 文件到 PHP 页面

    我需要一种上传文件并将其 POST 到 php 页面的方法 php 位于 apache 服务器上 我在我的桌面应用程序中使用这个 C 代码 这是一个c代码的套接字 当我执行程序时 可以得到 文件大小为772906 打开服务器正常 文件大小为
  • std::thread <未解析的重载函数类型> 错误

    我试图从我的类中生成一个线程 并且该线程在我的类中执行特定的方法 代码如下所示 class ThreadClass int myThread int arg do something void createThread thread t t
  • SQL Server 存储过程更新不适用于 ASP.Net C# GridView RowUpdating

    我遇到了问题 但没有抛出任何错误 发生的情况是 我有一个存储过程正在驱动我的更新 但我无法更新 gridview 我击中了Update链接按钮 但它实际上并没有更新记录 这是我的存储过程 ALTER PROCEDURE dbo CompDe
  • 我的代码将对象设置为错误的父对象,如何修复此问题?

    因此 我目前正在为一篇学校论文进行编程 当前我的代码工作计划 或者至少我认为应该是 在使用碰撞作为拖放条件下 将对象设置为指定父级的子级 使用 if 条件的传感器 然而 当我运行游戏时 我小时候想要设置的对象被错误的父母使用 这基本上就是发
  • 使用实体框架的子查询

    我正在移植一个子系统NHibernate to 实体框架并希望了解将以下查询移植到的最佳方法EF var date DateTime Now It can be any day AccountBalanceByDate abbd null
  • HttpContext.Current.Items["value"] 不起作用,因为 AngularJS 调用创建新会话

    我正在使用 C MVC 和 AngularJS 我的问题是我的 MVC 程序创建了一个HttpContext Current Items value 并在初始主控制器中设置值 但是当我的 AngularJS 通过 ajax 调用调用应用程序
  • 无法构建 lldb - 找不到“原子”文件

    我正在尝试建立lldb这是 Clang LLVM 3 4 2 下载的一部分LLVM 下载页面 http llvm org releases download html 我可以构建 LLVM Clang Compiler RT 和 Extra
  • 计算数组中共线的三元组的数量

    我被问到这个面试问题 C 算法 但不知道如何解决 给定一个包含 N 个不同点的笛卡尔坐标的数组 Arr N 计算三元组 Arr P Arr Q Arr R 的数量 使得 P 有任何想法吗 我可以为此使用什么算法 以下内容可能没有优化 但其复
  • 尝试更新 datagridview 时界面冻结

    我正在使用下面的代码复制文件并将状态列设置为datagridview通知用户连接已建立 但是当我按下按钮执行时 方法界面冻结 我已经搜索了很多我知道使用task run 不可能 因为它不包含在 not 4这是一个新功能 net 4 5我也知

随机推荐