2017-03-04 9 views
4

私は匿名クラスを使用したいが、usingコードブロック内でインスタンス化し、ブロックからエスケープさせる。これは可能ですか?c#匿名クラスの内部スコープブロックからエスケープする方法はありますか?

例えば、私は

using (var s = something()) { 
    var instance = new { AA = s.A }; 
    // ... lots of code 
    Console.WriteLine(instance.AA); 
} 

を持っていると私はむしろのようなものだろう:

var instance = new { Name = default(string) }; 
using (whatever) 
{ 
    instance = new { Name = whatever.Whatever() }; 
} 
... 

しかし、ここで行うには良いものが作成することです:

var instance; // <- nope, can't do this 
using (var s = something()) { 
    instance = new { AA = s.A }; 
} 
// ... lots of code 
Console.WriteLine(instance.AA); 
+4

具体的なクラスを作成して使用してください。 –

+1

@EhsanSajjad重要な点は匿名クラスを使用することです。 – CoderBrien

答えて

8

が簡単に行われます実際のクラス。

またはC#7では、タプルの使用を検討してください。

static R Using<A, R>(A resource, Func<A, R> body) where A : IDisposable 
{ 
    using (resource) return body(resource); 
} 
... 

var instance = Using(something(), s => new { AA = s.A }); 

、あなたが本当に空想を取得したい場合は...しかし、これは愚かなようです。ちょうどクラスを作る!

+0

素晴らしい。助けてくれてありがとう!ジェネリックメソッドテクニックは素晴らしいです。あなたはダ男! – CoderBrien

+1

この 'Using'メソッドは、実際の' using'ステートメントでは使用できない使い捨てリソースのリークを引き起こすことに注意してください。 2番目のパラメータの評価がスローされ、例外が発生した場合、リソースは廃棄されません。使い捨てのリソースと方法の使い方によっては、それが懸念される場合もあれば、そうでない場合もあります。 – Servy

+0

@servyあなたは本当ですか?それは正しいとは思わない。 – CoderBrien

1

私はしばしばこの目的のためにstatic Useメソッドを書いています。

class SomethingDisposable : IDisposable { 

    ...  

    public static T Use<T>(Func<SomethingDisposable, T> pFunc) { 
     using (var somethingDisposable = new SomethingDisposable()) 
     return pFunc(somethingDisposable); 
    } 

    // also a version that takes an Action and returns nothing 

    ... 
} 

は今、あなたはただ、あなたが望むものは何でもしても匿名型を返すことができ、そしてそれは常に安全にusingに包まれます。 Entity Frameworkを使用している場合など、これらは非常に便利です。

var result = SomethingDisposable.Use(sd => sd.DoSomething()); 
var anonResult = SomethingDisposable.Use(sd => new { Property = sd.DoSomethingElse() }); 

// etc. 
+0

はい!これはまさに私がやったことです。 – CoderBrien

関連する問題