c#匿名类逃避内部范围块的任何方式?

时间:2017-03-04 07:26:15

标签: c# anonymous-types

我想使用匿名类,但在using代码块中实例化并让它逃脱阻止。这有可能吗?

例如,我有

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);

2 个答案:

答案 0 :(得分: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 });

但这看起来很傻。刚上课!

答案 1 :(得分: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中。这些非常方便,例如,在使用Entity Framework时。

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

// etc.