我有一个方法
T Get<T>(string key)
{..
}
如果来电者打电话给我,T = IEnumerable<V>
我需要做:
return GetEnum<V>(key)
因此我需要
- 测试 T 是否为
IEnumerable<X>
- 获取 X 并将其塞入 GetEnum 方法
我怀疑我不能做第二个
显然我可以编写不同的方法,但这不是我与现有代码库的合同。
你可以通过一点反思来做到这一点,但它不会特别快:
static class TheClass
{
public static T Get<T>(string key)
{
// Adjust these as required:
const BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic;
if (typeof(T).IsGenericType && typeof(IEnumerable<>) == typeof(T).GetGenericTypeDefinition())
{
Type v = typeof(T).GetGenericArguments()[0];
var baseMethod = typeof(TheClass).GetMethod("GetEnum", flags);
var realMethod = baseMethod.MakeGenericMethod(v);
return (T)(object)realMethod.Invoke(null, new[] { key });
}
// TODO: Handle other types...
}
private static IEnumerable<T> GetEnum<T>(string key)
{
// TODO: Return an enumerable...
}
}
编辑
如果要检查所需的返回类型是否实现 IEnumerable<>
,可以使用:
Type enumerable = typeof(T).GetInterface("System.Collections.Generic.IEnumerable`1");
if (enumerable != null)
{
Type v = enumerable.GetGenericArguments()[0];
var baseMethod = typeof(TheClass).GetMethod("GetEnum", flags);
var realMethod = baseMethod.MakeGenericMethod(v);
return (T)(object)realMethod.Invoke(null, new[] { key });
}
但是,您的GetEnum<V>
方法必须返回一个可以转换为 的值T
,否则您将得到一个无效的转换异常。
例如,如果您的GetEnum<V>
方法返回new List<T>(...)
,那么您的Get<T>
方法仅在T
isList<T>
或由 实现的接口时才有效List<T>
。如果你打电话Get<HashSet<int>>
,它会失败。