2012-01-02 99 views
1

我試圖通過調用以下內容來調用:StaticClass.DeleteObject(null, key)。它沒有像我期望的那樣工作,並且lambda表達式中的代碼拋出NullReferenceException,因爲上下文爲空,這是可以理解的。我嘗試將AmazonS3Operation的上下文參數更改爲ref,但ReSharper隨後警告「訪問修改後的關閉」。C#關閉和訪問外部變量

基本上我只是想在注入方法中注入lambda表達式,然後調用它,如果你知道我想如何工作。這是可能的,或者我能做些什麼,如果不是,那麼相似?

/// <exception cref="IOException"></exception> 
public static void DeleteObject(this AmazonS3Context context, string key) 
{ 
    AmazonS3Operation(context,() => context.Client.DeleteObject(
     new DeleteObjectRequest().WithBucketName(context.CurrentBucket) 
      .WithKey(key))); 
} 

/// <exception cref="IOException"></exception> 
private static void AmazonS3Operation(AmazonS3Context context, Action operation) 
{ 
    var shouldDispose = false; 
    try 
    { 
     if (context == null) 
     { 
      context = new AmazonS3Context(); 
      shouldDispose = true; 
     } 

     operation(); 
    } 
    catch (AmazonS3Exception e) 
    { 
     throw new IOException(e.Message, e); 
    } 
    finally 
    { 
     if (shouldDispose) 
      context.Dispose(); 
    } 
} 

回答

3

我會將上下文傳遞給動作。將操作參數替換爲操作<AmazonS3Context>參數。

 /// <exception cref="IOException"></exception> 
    public static void DeleteObject(this AmazonS3Context context, string key) 
    { 
     context = null; 
     AmazonS3Operation(context, ctx => ctx.Client.DeleteObject(
      new DeleteObjectRequest().WithBucketName(ctx.CurrentBucket) 
       .WithKey(key))); 
    } 

    /// <exception cref="IOException"></exception> 
    private static void AmazonS3Operation(AmazonS3Context context, Action<AmazonS3Context> operation) 
    { 
     var shouldDispose = false; 
     try 
     { 
      if (context == null) 
      { 
       context = new AmazonS3Context(); 
       shouldDispose = true; 
      } 

      operation(context); 
     } 
     catch (AmazonS3Exception e) 
     { 
      throw new IOException(e.Message, e); 
     } 
     finally 
     { 
      if (shouldDispose) 
       context.Dispose(); 
     } 
    } 
+0

+1我不知道誰低估了這個,但這是我想到的確切解決方案!這是一個很好的答案。 – 2012-01-02 06:25:38

1

的方法使用的局部變量,而不是修改你的參數:

AmazonS3Context localContext = context; 
try { 
    if (locaContext == null) { 
    // keep using localContext... 

,有你的行動是

Action<AmazonS3Context> 

這樣你就可以在實例傳遞依靠,而不是封閉。被調用的方法已經有了你想要的實例作爲其他參數,所以在這裏使用閉包將被認爲是有害的。