加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 创建泛型类的通用工厂

发布时间:2020-12-15 21:16:26 所属栏目:百科 来源:网络整理
导读:我有一组值类型转换器,可以将字符串转换为各自的类型.我有一个工厂负责在需要时根据类型创建这些转换器.我试图让工厂和转换器保持通用,但我遇到了一些问题.在工厂调用.Create方法之前我不知道类型,所以我需要能够将类型作为参数传递.麻烦的是,然后,我的.Crea
我有一组值类型转换器,可以将字符串转换为各自的类型.我有一个工厂负责在需要时根据类型创建这些转换器.我试图让工厂和转换器保持通用,但我遇到了一些问题.在工厂调用.Create方法之前我不知道类型,所以我需要能够将类型作为参数传递.麻烦的是,然后,我的.Create方法认为我正在寻找ValueConverter< Type>而不是像ValueConverter< int>这样的更合适的值转换器.我错过了什么,或者甚至做错了.

这是我的几个转换器和界面:

public interface IValueConverter<T>
{
    T Convert(object objectToConvert);
}

public class IntValueConverter : IValueConverter<int>
{
    public int Convert(object objectToConvert)
    {
        return System.Convert.ToInt32(objectToConvert);
    }
}

public class DateTimeValueConverter : IValueConverter<DateTime>
{
    public DateTime Convert(object objectToConvert)
    {
        return System.Convert.ToDateTime(objectToConvert);
    }
}

然后,我有一个这样的工厂:

public class ValueConverterFactory : IValueConverterFactory
{
    private readonly IUnityContainer _container;

    public ValueConverterFactory(IUnityContainer container)
    {
        _container = container;
    }

    public IValueConverter<T> Create<T>(T type)
    {
        return _container.Resolve<IValueConverter<T>>();
    }
}

统一配置如下:

Container.RegisterType<IValueConverter<int>,IntValueConverter>();
Container.RegisterType<IValueConverter<DateTime>,DateTimeValueConverter>();

我需要能够像这样打电话给工厂:

var objectType = someObj.GetType();
var valueConverter = _valueConverterFactory.Create(objectType);

解决方法

The trouble is that,then,my .Create method thinks I’m looking for a ValueConverter<Type> instead of a more appropriate value converter like ValueConverter<int>.

首先,你应该明白为什么会这样.你没有给我们调用代码,但它可能看起来像这样:

Type type = SomehowResolveTheTypeThatINeedToConvertTo();
factory.Create(type);

就在那里,那将调用泛型方法

IValueConverter<T> ValueConverterFactory.Create<T>(T type)

其中Type替换类型参数T.

其次,你需要明白你所要做的事情是根本无法做到的.您在编译时不知道类型,因此您无法进行强类型输入.为了获得强类型IValueConverter< T>你需要知道T是什么.您要么愿意接受转换器返回对象而不是T,要么找到一种方法让您在编译时知道类型T.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读