Мне нравится этот простой инструмент:
public static class Klass
{
public static Klass<T> Of<T>(){ return Klass<T>.instance; }
}
public class Klass<T>
{
public static Klass<T> instance = null;
}
и теперь вы можете:
public K Process<T,K>(Klass<T> t, IEnumerable<K> items)
{
....
}
var aKey = Process(Klass.Of<string>(), mySetOfItems);
// aKey will be autotyped to a string
, но учтите, что для этого потребовалось доработать d для метода процесса. Этот параметр используется исключительно для устранения отсутствующего типа. Вот почему «экземпляр» всегда равен нулю. Значение не важно, все, что считается, это то, что этот null имеет тип Klass.
Однако обратите внимание, что этот 100% -ый ресурс избавляет вас от использования явных параметров типа, например, в Process<string, ....>
, потому что вам не нужно явно проезжать параметр типа <string>
. Таким образом, все параметры типа привязаны к аргументам, и это позволяет копилеру автоматически разрешать анонимные типы, включая элемент IEnumerable.
Редактировать: Я только что вспомнил о еще одной вещи, хотя и более сложной и сложной. Анонимные типы полностью устаревают. Это означает, что один анонимный тип с «string Key, int Value» является абсолютно тем же классом, что и второй анонимный тип, созданный в другом месте, который также является «string Key, int Value». Это позволяет создать небольшой вспомогательный метод, описанный здесь CastByExample.
Как правило, вы не можете «указать» анонимный тип, потому что, ну, это неназванный, и вы не можете записать его имя. Но, благодаря дактилизму, эта драгоценная статья показывает, как вы можете обеспечить никогда не исполняемую лямбду, которая возвращает «образец» анонимного объекта только для того, чтобы перехватить анонимный тип, который он определяет, чтобы этот тип можно было передать цепочка выражений. Очень угловой, но интересная вещь!
Ну, как на земле «Процесс» должен знать, как извлечь «K» из вашего набора? Если вы предоставите эту информацию, она, вероятно, будет в форме, где будет выполняться вывод типа ... –
При использовании анонимных типов вы не можете явно указывать аргументы типа, поскольку один из типов не имеет имени (является анонимным). Вам придется полагаться на вывод типа и полностью опускать аргументы типа, а это значит, что вам нужно найти другой способ указать аргумент второго типа. (Это в основном парафраз того, что уже сказал @JonSkeet.) – cdhowie
Просто интересно - что вы делаете внутри этого метода Процесса? Вернет ли он DateTime, если я назову его 'Process (arrayOfIntegers)'? –