我有一組值轉換器將字符串轉換爲各自的類型。我有一個工廠,負責根據需要創建這些轉換器。我試圖保持工廠和轉換器通用,但我遇到了一些問題。直到我在工廠調用.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);
你是怎麼調用Create方法的?問題可能是IoC的東西,我從來沒有使用它,也不能說。但一個簡單的工廠工作,即我可以做以下事情:IConverter myConverter = factory.Create (typeof(int)); –
Sisyphus
我不能在泛型方法調用中指定我的類型,因爲直到運行時才知道類型。 –
不知道你可以做你想做的事情。這種想法不,但是......你說你直到運行時才知道類型。但要甚至使用轉換,你必須說int myVar = Convert ...或者你正在嘗試var myVar = Convert?由於可讀性和其他方面(我使用nhib而非LINQ等),我不喜歡隱式類型的風扇,所以我不太熟悉使用隱式類型,但據我所知,編譯器必須能夠以某種方式確定類型。你不能用它來完全避免打字。我沒有看到編譯器如何從您的預期實現中推斷出類型? – Sisyphus