我有一种适用于泛型的方法:
public static IRestResponse<T> Get<T>(long id, string apiEndPoint) where T : new()
{
return Execute<T>(Method.GET, null, string.Concat(apiEndPoint, "/", id));
}
我使用此方法以通用的方式传递视图模型以获取解析结果:
var result = RestHelper.Get<AnyViewModel>(1, "Country"));
但是我遇到一个例子,我有一个变量实体,可以从中获取视图模型:
var entity = "Country"; // This comes as a parameter
var viewModels = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.Contains("Core.ViewModel"));
if (viewModels != null)
{
Type viewModel = viewModels.GetTypes().FirstOrDefault(x => x.Name.Contains(entity));
if (viewModel != null)
{
var result = RestHelper.Get<???>(1, entity);
}
}
因此,我可以通过反射获得视图模型类型,但是我不知道该如何传递给<???>
函数的泛型。
更新
我不知道这会对反射产生多大的影响,但是我对该Get
方法有更多的重载:
public static IRestResponse Get(string apiEndPoint)
public static IRestResponse<T> Get<T>(string apiEndPoint) where T : new()
public static IRestResponse Get(long id, string apiEndPoint)
public static IRestResponse<T> Get<T>(long id, string apiEndPoint) where T : new()
您将必须使用反射使用Get<T>
泛型参数来调用方法MakeGenericMethod
。
编辑由于存在多个重载,请GetMethods
改用并将其缩小到您要查找的重载。(我看不到GetMethod
可以让您指定类型实参的重载。)
MethodInfo method = typeof(RestHelper).GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(method => method.Name == "Get"
&& m.GetGenericArguments().Length == 1
&& m.GetParameters().Length == 2
// just to be certain, in case someone adds more overloads in the future ...
&& m.GetParameters()[0].ParameterType == typeof(int)
&& m.GetParameters()[1].ParameterType == typeof(string))
.FirstOrDefault();
if (method == null)
throw new InvalidOperationException("Couldn't find an overload of RestHelper.Get<T> with int, string parameters");
MethodInfo genericMethod = method.MakeGenericMethod(viewModel);
genericMethod.Invoke(null, new object[] { 1, entity });
编辑
要使用“ List<viewModel>
”,您可以使用Type.MakeGenericType
获取List<T>
:
var genericType = typeof(List<>).MakeGenericType(viewModel);
var genericMethod = method.MakeGenericMethod(genericType);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句