Передача типов вокруг и использование их в качестве параметров типа

1

Почему я не могу сделать что-то вроде этого:

var myDictionary = new Dictionary<string, Type>();

// Add data to dictionary

foreach(var kvPair in myDictionary)
{
    var result = SomeMethod<kvPair.Value>(kvPair.Key); // Error
}

Поэтому я не могу использовать Type, который у меня есть в элементе Dictionary, и использовать его в параметре type. Да, я могу просто отправить словарь в SomeMethod (KeyValuePair). Однако я не контролирую, как функция реализована.

Ошибка: имя типа или пространства имен "kvPair" не может быть найдено (вам не хватает директивы using или ссылки на сборку?

Я чувствую, что мне не хватает чего-то довольно фундаментального, и я не уверен, что это такое.

  • 0
    @JasonP Несмотря на то, что это одно из возможных решений, я думаю, что называть его дубликатом довольно сложно, поскольку дженерики вообще не упоминаются в этом вопросе.
  • 0
    @JasonP Я с Д.С.Танли. В противном случае вы можете сделать вывод, что почему это не работает? Просто объяснение того, почему это не работает, чего нет в предложенном дубликате. Это не дубликат, а связанный вопрос.
Теги:

1 ответ

3
Лучший ответ

Я чувствую, что мне не хватает чего-то довольно фундаментального, и я не уверен, что это такое.

Да, вам не хватает, что общие параметры являются статическими, а не динамическими. Они не могут быть обнаружены во время выполнения. Один из вариантов в вашем случае - использовать рефлексию для создания вызова метода generic во время выполнения:

foreach(var kvPair in myDictionary)
{
    // use reflection to create generic MethodInfo object
    MethodInfo mi = typeof(this).GetMethod("SomeMethod");
    MethodInfo mig = mi.MakeGenericMethod(kvPair.Value);

    // call generic method
    Object result = mig.Invoke(this, new object[] {kvPair.Key}); 

    // cast to desired return type.
}

Однако, прежде чем идти по этой дороге, я бы сделал шаг назад и посмотрел, являются ли дженерики лучшим дизайном, теперь вы знаете, что они не опоздали.

  • 0
    +1 для отражения решения этого.
  • 0
    Ааа, теперь это имеет большой смысл. Хм ... Мне нравится решение, оно интересное, но я бы хотел использовать рефлексию для достижения этой цели. Мне придется еще немного подумать о том, что я пытаюсь сделать. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню