Как перебирать список классов и использовать их как общие c типы? - PullRequest
2 голосов
/ 12 июля 2020

У меня есть список из 30 классов моделей, и я должен выполнить следующие действия для каждого класса:

private static IEdmModel GetEdmModel(IServiceProvider serviceProvider)
{
   var odataBuilder = new ODataConventionModelBuilder(serviceProvider);

odataBuilder
 .EntitySet<AnswerCondition>("AnswerConditions")
 .EntityType
 .Select()
 .Expand()
 .OrderBy()
 .Filter()
 .Count();

Теперь я хочу иметь список ключей и значений и выполнять это действие внутри for l oop:

var list = new List<KeyValuePair<string, Type>>() {
          new KeyValuePair<string, Type>("ActionTypes", typeof(ActionType)),
          new KeyValuePair<string, Type>("AnswerConditions", typeof(AnswerCondition)),
.
.
.
};

foreach (KeyValuePair<string, Type> item in list)
 {
    string address = item.Key;
    Type t = item.Value;
    odataBuilder
     .EntitySet<t>(address)
     .EntityType
     .Select()
     .Expand()
     .OrderBy()
     .Filter()
     .Count();
 }

Но отображается ошибка t

't' - это переменная, но используется как тип

Как я могу сохранить список классов в переменной и использовать их позже как общий c тип?

1 Ответ

0 голосов
/ 12 июля 2020

Использование отражения:

Type oDataType = odataBuilder.GetType();
MethodInfo genericMethod = oDataType.GetMethod("EntitySet", 1, new[] {typeof(string)});

foreach (KeyValuePair<string, Type> item in list)
 {
    string address = item.Key;
    Type t = item.Value;
    MethodInfo method = genericMethod.MakeGenericMethod(t);

    dynamic set = method.Invoke(odataBuilder, new object[]{address});
    set
     .EntityType
     .Select()
     .Expand()
     .OrderBy()
     .Filter()
     .Count();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...