2012-06-16 4 views
1

У меня есть Func в моем коде, который объявлен как это:Использование Func <T> параметры

Func<string, int, bool> Filter { get; set; } 

Как я могу достичь строки и Int переменные, параметры Func для того, чтобы использовать их в своем коде ?

+0

Подумайте о 'Filter' как методе. Он не имеет значения для параметров 'string' или' int'. Эти значения передаются при вызове метода. – alf

+0

У Func нет строк и int * variables * в качестве параметров. Он имеет значения string и int * *. Переменные (возможно, могут быть литералами!), Которые при условии, что эти значения должны быть неактуальны для Func. – AakashM

ответ

4

Только параметры есть, когда функция вызывается ... и они доступны только в пределах функции. Так, например:

foo.Filter = (text, length) => text.Length > length; 

bool longer = foo.Filter("yes this is long", 5); 

Здесь значение «да это долго» это значение параметра text в то время как делегат выполняет и также значение 5 является значение параметра length в то время как это выполнение. В других случаях это бессмысленная концепция.

Что вы действительно пытаетесь достичь? Если бы вы могли дать нам больше контекста, мы бы почти наверняка вам помогли.

+0

Я пытаюсь получить функцию от пользователя, который должен фильтровать некоторые из элементов, которые у меня есть в моем классе. Каждый элемент состоит из String и int. Проблема в том, что у меня есть только строка, я хочу использовать эту функцию для обновления int-части во время вызова этой функции. Я знаю, что это не совсем правильный способ, но основанные ограничения, которые у меня есть, кажется единственным способом. –

+0

@YoniPlotkin: Извините, мне все еще не совсем ясно, что происходит. Функция, которая * принимает * '' int', не должна полагаться на * update * it. Может быть, было бы яснее, если бы вы могли предоставить короткий, но полный пример того, чего вы пытаетесь достичь. –

+0

Простите за то, что неясно, я попробую объяснить У меня есть компонент, пользовательский и серверный классы класс пользователя выглядит примерно так: 'public class Component { string Id {get; } int Статус {get; } } ' и еще несколько функций ... Класс пользователя выглядит следующим образом: 'public class User { string Id {get; } IDictionary Статус {get; } IEnumerable RelevantComponents {get; } Func Фильтр {get; задавать; } } ' –

4

Вы можете использовать анонимный метод:

Filter = (string s, int i) => { 
    // use s and i here and return a boolean 
}; 

или стандартный метод:

public bool Foo(string s, int i) 
{ 
    // use s and i here and return a boolean 
} 

, а затем вы можете присвоить свойство Filter этому методу:

Filter = Foo; 
1

Престола этот образец здесь - http://www.dotnetperls.com/func

using System; 

class Program 
{ 
    static void Main() 
    { 
    // 
    // Create a Func instance that has one parameter and one return value. 
    // ... Parameter is an integer, result value is a string. 
    // 
    Func<int, string> func1 = (x) => string.Format("string = {0}", x); 
    // 
    // Func instance with two parameters and one result. 
    // ... Receives bool and int, returns string. 
    // 
    Func<bool, int, string> func2 = (b, x) => 
     string.Format("string = {0} and {1}", b, x); 
    // 
    // Func instance that has no parameters and one result value. 
    // 
    Func<double> func3 =() => Math.PI/2; 

    // 
    // Call the Invoke instance method on the anonymous functions. 
    // 
    Console.WriteLine(func1.Invoke(5)); 
    Console.WriteLine(func2.Invoke(true, 10)); 
    Console.WriteLine(func3.Invoke()); 
    } 
} 
+6

На самом деле вам не нужно вызывать Invoke, вы можете просто 'func1 (5)'. – R0MANARMY