我有一组值类型转换器,可以将字符串转换为各自的类型.我有一个工厂负责在需要时根据类型创建这些转换器.我试图让工厂和转换器保持通用,但我遇到了一些问题.在工厂调用.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 aValueConverter<Type>
instead of a more appropriate value converter likeValueConverter<int>
.
首先,你应该明白为什么会这样.你没有给我们调用代码,但它可能看起来像这样:
Type type = SomehowResolveTheTypeThatINeedToConvertTo(); factory.Create(type);
IValueConverter<T> ValueConverterFactory.Create<T>(T type)
其中Type替换类型参数T.
其次,你需要明白你所要做的事情是根本无法做到的.您在编译时不知道类型,因此您无法进行强类型输入.为了获得强类型IValueConverter< T>你需要知道T是什么.您要么愿意接受转换器返回对象而不是T,要么找到一种方法让您在编译时知道类型T.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。