2015-11-13 2 views
2

Я читал this вопрос, где один ответил предлагает этот метод:Определение делегата план

public static void Method<T>(Func<int,T> del) { 
    var t = del(42); 
} 

Какие должны быть использованы следующим образом: Method<SomeType>(x => new SomeType(x));
Method тело не важно на этот вопрос. Если делегат/лямбда не находится в этом «стиле», метод не будет работать должным образом. Например, если он вызван как Method(x => new Foo());, он не будет «работать», потому что цель обходного пути будет потеряна.
Целью является обеспечение, что T имеет конструктор, принимающий 1 параметр типа int. Хотел бы я сделать T(int) Так или иначе, чтобы гарантировать, что делегат должен всегда быть x => new SomeType(x)? Или есть альтернатива? Я искал много мест и ничего не могу придумать.

+2

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

+0

Да, я могу заставить 'Method' взять T и int, но как он создаст' Foo'? 'Foo' не известен методу. Предположим, что 'Method' находится в другой библиотеке. –

+0

Нет, я имею в виду создание другого 'Method (Func del)', который перегрузил бы другой, так что вы могли бы назвать его одним из них. Поскольку вы не можете заставить существующего принять 'Func ', потому что он ожидает 'Func '. –

ответ

0

Для этого вам не нужен func. Просто передайте требуемый тип и верните объект и убедитесь, что int передан в него. Тогда вы в основном просто создаете фабричный метод, который даст вам тип, который вы хотите, с переданным целым числом.

public T Method<T>(int whatever) where T : class 
{ 
    return (T)Activator.CreateInstance(typeof(T), whatever); 
} 

var type = Method<SomeType>(55); 
+0

Это невозможно. Вы не можете вызывать 'T()' с параметрами. Это дает ошибку компилятора «T»: не может предоставить аргументы при создании экземпляра типа переменной « –

+0

Да, это правильно, обновлено. –

+0

Это снова нарушает цель обходного пути в вопросе, который я связал. Я это делаю, как я могу гарантировать, что 'T' будет иметь конструктор, принимающий int? Если бы этот «метод» не выбрал какое-то исключение во время выполнения. Конечно, я могу быть осторожным при кодировании, но я хочу использовать generics для обеспечения соблюдения правил. –

Смежные вопросы