2009-10-20 4 views
0

Comment puis-je fournir une func à une méthode, donc je pourrais écrire quelque chose comme:Passage en ligne func comme paramètre (par exemple a => a ....)

MethodTest(a => a.IsAltTagAvailable); 

Lorsque la signature de cette méthode prend une fonction qui renvoie un objet (disons HtmlImage) lorsque la condition est remplie (essentiellement un prédicat). Editer: Je dois passer le type sur lequel je vais travailler en tant que T (Paramètre)

J'ai oublié de faire ça, comme c'est maladroit!

Merci

Répondre

1
void MethodTest(Func<HtmlImage> func) { 

} 
+0

Non, cela ne fonctionne pas, Func , T est la valeur de retour. –

+0

@Stefan: basé sur ma compréhension de la question qu'il voulait "Lorsque la signature de cette méthode prend une fonction qui renvoie un objet" ce qui est contradictoire avec le Lambda qu'il a écrit dans son code. –

1
public void MethodTest(Func<HtmlImage> delegate) 
{ 
//do what you want 
} 

OU:

public delegate HtmlImageTagHandler(HtmlImage image); 


public HtmlImage MethodTest(HtmlImageTagHandler handler, HtmlImage image) 
{ 
    return handler(image) == true ? image : null; 
} 

utilisation:

MethodTest(a => a.IsAltTagAvailable, a); 
+0

Non, cela ne fonctionne pas, dans Func , T est la valeur de retour. –

+0

Oui, il semble y avoir une petite contradiction dans sa question ... quant à ce qu'il veut. – CSharpAtl

3

Un prédicat tend à revenir bool, pas un objet. Qu'allez-vous retourner quand la condition n'est pas remplie? Compte tenu de votre exemple, vous ne voulez pas vraiment dire la fonction renvoie un objet - vous voulez dire prend un objet et renvoie un bool.

Notez que si vous avez un paramètre dans l'expression lambda, vous devez utiliser un délégué qui prend également les paramètres.

Nous avons vraiment besoin de plus d'informations avant de donner une réponse définitive, mais vous voudrez peut-être quelque chose comme:

void MethodTest(Func<HtmlImage, bool> predicate) 

ou

void MethodTest(Predicate<HtmlImage> predicate) 

(Personnellement, j'aime la nature descriptive de l'aide d'un délégué nommé, mais d'autres préfèrent utiliser Func/Action pour presque tout.)

Cela suppose que le type d'entrée est fixe . Sinon, vous pouvez en faire une méthode générique:

void MethodTest<T>(Predicate<T> predicate) 
1
void MethodTest(Func<HtmlImage, object> func) 
{ 

} 

HtmlImage est l'argument de la fonction (x), object la valeur de retour, vous pouvez prendre le type concret si vous voulez spécifier il.

void MethodTest(Func<HtmlImage, bool> func) 

Ce qui est un prédicat:

void MethodTest(Predicate<HtmlImage> func) 

Pour le rendre remplacer complètement générique, HtmlImage avec un argument générique:

void MethodTest<T>(Predicate<T> func) 
Questions connexes