为了账号安全,请及时绑定邮箱和手机立即绑定

处理循环中的所有成员

处理循环中的所有成员

C#
莫回无 2021-06-04 18:02:55
我有一个非常大的项目,有多个页面,每个页面都有很多IDisposable成员。我试图找出一种方法来处理IDisposable循环中的所有成员,这样我就不必x1.Dispose(); x2.Dispose; ... xn.Dispose在每个类上都打字。有没有办法做到这一点?
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

使用反射(未测试):


    public static void DisposeAllMembersWithReflection(object target)

    {

        if (target == null) return;

        // get all fields,  you can change it to GetProperties() or GetMembers()

        var fields = target.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);

        // get all fields that implement IDisposable

        var disposables = fields.Where(x => x.FieldType.GetInterfaces().Contains(typeof(IDisposable)));


        foreach (var disposableField in disposables)

        {

            var value = (IDisposable)disposableField.GetValue(target);

            if (value != null)

                value.Dispose();

        }

    }


查看完整回答
反对 回复 2021-06-05
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

当然,只要确保您创建一个列表来保存它们,并尝试最终阻止以防止泄漏它们。


// List for holding your disposable types

var connectionList = new List<IDisposable>();    


try

    // Instantiate your page states, this may be need to be done at a high level


    // These additions are over simplified, as there will be nested calls

    // building this list, in other words these will more than likely take place in methods

    connectionList.Add(x1);

    connectionList.Add(x2);

    connectionList.Add(x3);

}

finally

{

    foreach(IDisposable disposable in connectionList)

    {

        try

        {

            disposable.Dispose();

        }

        catch(Exception Ex)

        {

            // Log any error? This must be caught in order to prevent

            // leaking the disposable resources in the rest of the list

        }

    }

}

然而,这种方法并不总是理想的。嵌套调用的性质将变得复杂,并且要求调用在程序架构中处于最上层,您可能只想考虑在本地处理这些资源。


此外,这种方法在这些 Disposable 资源密集且需要立即释放的场景中严重失败。虽然您可以执行此操作,即跟踪您的 Disposable 元素,然后一次性完成所有操作,但对于像这样的托管资源,最好尝试使对象生命周期尽可能短。


无论您做什么,请确保不要泄漏 Disposable 资源。如果这些是连接线程,并且它们在一段时间内处于非活动状态,那么简单地查看它们的状态然后在不同的地方重新使用它们而不是让它们徘徊也可能是明智的。


查看完整回答
反对 回复 2021-06-05
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

创建将处理所有一次性对象的方法:


public void DisposeAll()

{

    x1.Dispose();

    x2.Dispose();

    x3.Dispose();

    . . .

}

并在任何需要的地方调用它。


查看完整回答
反对 回复 2021-06-05
  • 3 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信