Передача типа во время выполнения в FirstOrDefault - PullRequest
1 голос
/ 09 августа 2010

У меня есть такой общий код:

private bool DoItStartup(IReader reader, Type provider)
{
 /// lots of common boiler plate code
 /// like:

    var abcProvider = reader.ReaderData as AbcProvider;
    var xyzProvider = abcProvider.Provisions.FirstOrDefault<XyzProvider>(); // line 2
}

Вышеуказанные строки кода предназначены для примерно 50 или некоторых провайдеров, теперь Строка 2, я хочу в основном сделать это:

var xyzProvider = abcProvider.Provisions.FirstOrDefault<typeOf(provider)>();

Это не работает, возможно, потому что xyzProvider не знает, что это тип @ время компиляции?Точно сказать не могу.Но есть ли подобный шаблон, который я могу использовать.В противном случае мне придется продублировать этот код с кодом 50 раз: (

Ответы [ 4 ]

3 голосов
/ 09 августа 2010

Не зная типа abcProvider.Provisions сложно сказать наверняка ... но обычно я не предоставляю любые аргументы типа для FirstOrDefault ... Я просто позволяю вывод типа работа.

Вы пытались просто позвонить:

var xyzProvider = abcProvider.Provisions.FirstOrDefault();

(Причина, по которой он не работает, заключается в том, что аргументы типа должны быть именами типов или параметров типа; они не могут быть выражениями, вычисляемыми во время выполнения.)

1 голос
/ 09 августа 2010

Возможно, вам понадобится Generics.

На MSDN есть несколько статей, которые освещают это:

Generics (Руководство по программированию в C #)

Введение в C # Generics

Общие методы (Руководство по программированию в C #)

1 голос
/ 09 августа 2010

Похоже, вам нужно предоставить универсальный параметр для метода или класса, который включает в себя код выше.Следующее должно работать правильно (не уверен, как провайдер передается в

public T GetStuff() {
   var xyzProvider = abcProvider.Provisions.FirstOrDefault<T>();
}
0 голосов
/ 09 августа 2010

Общие параметры универсальных типов определяются в типе компиляции (не во время выполнения). Но вы хотите, чтобы ваш код получал тип FirstOrDefault во время выполнения, что вызывает ошибку.
Попробуйте использовать это вместо:
private bool DoItStartup<T>(IReader reader, Type provider) {<br> ...<br> var x=list.FirstOrDefault<T>();<br> }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...