2017-03-04 16 views
4

我想使用匿名類,但在using代碼塊中實例化並讓它轉義塊。這可能嗎?c#匿名類轉義內部作用域塊的任何方式?

例如,我有

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

而且我寧願是這樣的:

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

容易實現:

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

但更好的東西在這裏做的是創造一個實際的班級。或者在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'語句不可用的可拋棄資源的可能泄漏。如果第二個參數的評估拋出異常,那麼資源不會被處置。取決於一次性資源以及您如何使用該方法,這可能會或可能不會成爲問題。 – Servy

+0

@servy你確定嗎?這看起來不正確。 – CoderBrien

1

我經常爲此寫靜態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。這些非常方便,例如,在使用實體框架時。

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

// etc. 
+0

是的!這正是我所做的。 – CoderBrien