让我们考虑一个接口中的方法:
public Interface IA {
T[] Get<T>() where T : IB;
}
Run Code Online (Sandbox Code Playgroud)
在另一个地方,我想为编译时已知的n 种类型调用此方法 n 次。下面的代码说明了我的意图。
foreach(Type t in new Type[] { typeof(X), typeof(Y), typeof(Z) })
{
InterfaceXYZImplement[] arr = c.Resolve<IA>().Get<t>();
//...more here
}
Run Code Online (Sandbox Code Playgroud)
现在,foreach循环显然使类型成为运行时值,因此我必须使用MakeGenericMethod.
有没有办法编写代码,让我可以为X,Y和执行代码Z,但只调用一次编写的方法?
将代码包装在方法中只会将问题向上移动(这是部分解决方案,但不是最终解决方案,呵呵)。
您可以使用一些辅助方法来实现此目的,该方法做出相当多的假设并使用dynamic.NET4 中的 new 关键字。
基本上,当使用类型的参数是 时,该解决方案利用 DLR 的功能来正确推断用于泛型方法的类型dynamic。为此,您将需要两个辅助方法:
IB[] Get(IA a, Type t)
{
dynamic dummy = Activator.CreateInstance(t);
return Get(a, dummy);
}
T[] Get<T>(IA a, T dummy) where T : IB
{
return a.Get<T>();
}
Run Code Online (Sandbox Code Playgroud)
您的代码将调用第一个辅助方法:
foreach(var t in new Type[] { typeof(X), typeof(Y), typeof(Z) })
{
IB[] arr = Get(c.Resolve<IA>(), t);
// do more stuff here
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这种方法有几个缺点:
Activator.CreateInstance(t)。这一行假设存在一个可以使用的公共无参数构造函数,并且该构造函数不执行任何繁重的操作。IB此代码将在运行时引发异常。不会出现编译错误。IB,而不是特定类型的数组。| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |