我想使用匿名类,但在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);
答案 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.