假设我有一个具有多种类型约束的泛型方法,这个:
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)。您有两个选择:
创建新界面 我很棒的可比的东西 源自 IThing、IAwesome 和 IComparable
,有你的 类型实现它,并转换为 那个。 通过调用 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/