C#:如何查找和创建满足多种类型约束的实例

标签 c# generics reflection activator type-constraints

假设我有一个具有多种类型约束的泛型方法,这个:

public static void DoSomethingAwesome<T>(T thing)
    where T : IThing, IAwesome, IComparable<T>
{
    ...
}

现在......我如何使用反射创建可以发送到那里的东西?

如果这只是一个约束,我知道我可以这样做:

var types = assembly
      .GetTypes()
      .Where(typeof (IThing).IsAssignableFrom)

foreach(var t in types)
    DoSomethingAwesome((IThing) Activator.CreateInstance(t));

但是,无法真正转换为多个接口(interface)...我到底该如何解决这个问题?你可以说我现在几乎迷失了:P

标题有点长而且复杂,因为我不知道该怎么调用它,如果可以的话请改进

最佳答案

要添加 Reed 和 Loren 关于查找合适类型的答案,请注意,您仍然无法通过强制转换来调用 DoSomethingAwesome,因为正如您所发现的,编译器不提供将实例化对象强制转换为多个接口(interface)。您有两个选择:

  1. 创建新界面 我很棒的可比的东西 源自 IThing、IAwesome 和 IComparable,有你的 类型实现它,并转换为 那个。

  2. 通过调用 DoSomethingAwesome 反射。为此,您将 需要获取 MethodInfo 的 DoSomethingAwesome 通用方法, 然后打电话 MethodInfo.MakeGenericMethod 与 你的类型实现了所有三个 接口(interface)。

(2) 的示例:

Type type = sometype; // For example found using reeds method
MethodInfo mgeneric = typeof(Awesomeiser).GetMethod("DoSomethingAwesome");
MethodInfo mspecific = mgeneric.MakeGenericMethod(new [] { type });
mspecific.Invoke(null, new [] { type });

关于C#:如何查找和创建满足多种类型约束的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1521749/

相关文章:

带有通配符的 Java 泛型无法编译

c# - 如何获取方法中使用的内部变量的名称

c# - 以编程方式获取转换和输出运算符类型

c# - 在 .Net 中使用反射是否会导致性能相当糟糕?

c# - 在 C# 中,为什么单个转换可以同时执行拆箱和枚举转换?

c# - 如何使用 EPPlus 在工作表上设置页面布局中断

c# - "Invalid provider type specified"尝试加载证书私钥时出现CryptographicException

c# - 递归泛型类型

c# - List<T> 的深拷贝

c# - Autofac:使用非泛型接口(interface)注册泛型类型