2010-10-14 7 views
0

Je créais un Func comme entrée de paramètre pour une autre méthode, mais comment invoquer cela?Invoke méthode en Func lors de la transmission en tant que paramètre

Le code suivant décrit mon travail:

J'appelle Foo avec:

Foo(x => x.SlidingExpiration(TimeSpan.FromSeconds(50))); 

Ma méthode Foo:

public void Foo(Func<CacheExpiration, TimeSpan> cacheExpiration) 
{ 
.... 
inside here I want to call RefreshCache, but how?.. cacheExpiration.?? 

} 

Le CacheExpiration :)

public class CacheExpiration 
     { 
      TimeSpan timeSpan; 
      bool sliding; 

      public TimeSpan SlidingExpiration(TimeSpan ts) 
      { 
       this.timeSpan = ts; 
       this.sliding = true; 
       return ts; 
      } 
      public TimeSpan AbsoluteExpiration(TimeSpan ts) 
      { 
       this.timeSpan = ts; 
       return ts; 
      } 

      public bool RefreshCache(MetaObject mo) 
      { 
       //some logic.... 
       return true; 
      } 

     } 
+0

La question n'a pas entièrement de sens. Le paramètre de la fonction 'Foo' est un délégué qui, à la demande, peut transformer une instance' CacheExpiration' en 'Timespan'. La méthode 'Foo' n'a pas de référence à une instance' CacheExpiration' existante à transmettre au délégué. Quel objet 'CacheExpiration' voulez-vous appeler' RefreshCache'? Comment le paramètre délégué aide-t-il à cet égard? Il ne renvoie même pas un objet 'CacheExpiration'. – Ani

Répondre

0

Si je lis cela correctement, Func cacheExpiration prend une instance de CacheExpiration et renvoie un TimeSpan. Donc, je pouvais voir le corps de Foo étant:

TimeSpan ts = cacheExpiration.SlidingExpiration(TimeSpan.FromSeconds(50)); 
//or 
TimeSpan ts2 = cacheExpiration.AbsoluteExpiration(TimeSpan.FromSeconds(50)); 

Cela ne s'aligne pas avec le lamda dans votre exemple si je devine de ce que vous voulez vraiment être un cacheExpiration Func qui prend un Timespan et retourne un TimeSpan. Mais cela ne fonctionnerait pas pour la méthode RefreshCache car elle prend un MetaObject et renvoie un booléen.

+0

NServiceBus peut être configuré comme: NServiceBus.Configure.With(). Log4Net (a => a.YourProperty =" valeur "); pourquoi je ne peux pas faire quelque chose de similaire? Foo (x => x.SlidingExpiration (TimeSpan.FromSeconds (50))); – Janus007

+0

Dans Visual Studio, vous pouvez obtenir la signature de la méthode .Log4Net de NServiceBus en accédant à sa définition. Il semble qu'ils passent une fonction pour configurer le type générique. –

1
var ts = cacheExpiration(yourCacheExpiration);