簡體   English   中英

將變量ViewModel類型作為泛型傳遞給方法

[英]Pass a variable ViewModel type as generic to a method

我有一種適用於泛型的方法:

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);
    }
}

因此,我可以通過反射獲得視圖模型類型,但是我不知道該如何傳遞給函數的<???>泛型。

UPDATE

我不知道這會在多大程度上影響反射,但是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()

您將必須使用反射使用MakeGenericMethod來使用具有泛型參數的Get<T>方法。

編輯由於存在多個重載,請改用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM