我们如何将相似的 getter 合并在一起? [英] How can we merge similar getters together?

查看:61
本文介绍了我们如何将相似的 getter 合并在一起?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有 3 个类负责处理图像.老板让我合并.我把它合并到一个文件中,但他说这是一回事,我们需要按照一般逻辑将其合并.我们如何将这 3 个吸气剂合并为一个通用吸气剂?它们仅在传递给 Type.GetType() 的参数类型上有所不同.我们需要使用一个通用属性和一个通用 getter.

We have 3 classes responsible for handling Images. The boss asked me to merge it. I merged it in one file, but he said it is the same thing, we need to merge it in on general logic. How can we merge these 3 getters in a general one?? they are differ only in the parameter type which is passed to Type.GetType(). we need to use one generic attribute with one generic getter.

public class BonusImageHandler
{
    private static IStorageProvider _BAstorageProvider; 
    private static IStorageProvider _BAWP8storageProvider;
    private static IStorageProvider _M4MstorageProvider;

    private static readonly object _lock = new object();

    private static IStorageProvider BAStorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_BAstorageProvider == null)
                {
                    lock (_lock)
                    {
                        var storageProviderType = Type.GetType(BLL.Providers.ConfigurationProvider.Instance.BAStorageProviderTypeName);
                        _BAstorageProvider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _BAstorageProvider;
        }
    }

    private static IStorageProvider BAWP8StorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_BAWP8storageProvider == null)
                {
                    lock (_lock)
                    {
                        var storageProviderType = Type.GetType(BLL.Providers.ConfigurationProvider.Instance.BAWP8StorageProviderTypeName);
                        _BAWP8storageProvider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _BAWP8storageProvider;
        }
    }

    private static IStorageProvider M4MStorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_M4MstorageProvider== null)
                {
                    lock (_lock)
                    {
                        var storageProviderType = Type.GetType(BLL.Providers.ConfigurationProvider.Instance.M4MStorageProviderTypeName);
                        _M4MstorageProvider= (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _M4MstorageProvider;
        }
    }

}

推荐答案

这样的方法:

public void GetProvider(string typeName, ref IStorageProvider provider)
{
    if (provider == null)
    {
        lock (_lock)
        {
            if (provider == null)
            {
                var storageProviderType = Type.GetType(typeName);
                provider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
            }
        }
    }
}

应该可以解决问题.然后你这样称呼它:

should do the trick. Then you call it like this:

private static IStorageProvider BAWP8StorageProvider
{
    get
    {
        GetProvider(BLL.Providers.ConfigurationProvider.Instance.BAWP8StorageProviderTypeName, ref _BAWP8storageProvider);
        return _BAWP8StorageProvider;
    }
}

虽然我个人会丢失 _BAWP8StorageProvider 类成员,而只是使用属性(这也会删除丑陋的 ref 参数).

Though I would personally lose the _BAWP8StorageProvider class members, and just use the properties instead (that would remove the ugly ref parameters too).

这篇关于我们如何将相似的 getter 合并在一起?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆