通常當你遇到這種類型的問題時,你必須使用你的類的抽象,不需要泛型類型。
如果您的ModelFieldItem
實現了一個沒有泛型參數的接口,您可以使用它。
var _dict = new Dictionary<String, IModelFieldItem>()
{
new Converter<string, bool>() // If it's implement IModelFieldItem
};
(YouWillHaveToCastUnlessYouUseDynamicType)_dict[key].Convert("true");
否則,另一種方法是通過object
或dynamic
,以取代從Dictionary<String, ModelFieldItem>
的ModelFieldItem
,那麼你可以訪問從你的字典中的值時,將其丟。
var _dict = new Dictionary<String, object>()
{
new Converter<string, bool>()
};
// You can avoid the cast too by using dynamic
// But it will cost you some perf
((Converter<string, bool>)_dict[key]).Convert("true");
如果你知道你想要的類型。
你可以做這樣的事情:
var _dict = new Dictionary<String, object>()
{
new Converter<string, bool>()
};
public void Convert<TToConvert, TConverted>(string key, TToConvert valueToConvert, out TConverted valueConverted)
{
valueConverted = (T)_dict[key].Convert(valueToConvert);
}
bool value;
Convert("Key", "true", out value);
這裏你可以做一個其他例子:
public static void Convert<TToConvert, TConverted>(TToConvert valueToConvert, out TConverted valueConverted)
{
// You should put the dictionary outside of the method
// To avoid to instance it, each time you call this method
var dict = new Dictionary<Type, Func<object, object>>()
{
{ typeof(Tuple<string, int>), x => int.Parse((string)x) },
{ typeof(Tuple<string, bool>), x => bool.Parse((string)x) }
};
valueConverted = (TConverted)dict[typeof(Tuple<TToConvert, TConverted>)](valueToConvert);
}
static void Main(string[] args)
{
bool boolTest;
Convert("false", out boolTest);
Console.WriteLine(boolTest);
int intTest;
Convert("42", out intTest);
Console.WriteLine(intTest);
Console.ReadKey();
}
Obvisouly,你應該嘗試,如果你可以將你的類型,第一和也如果轉換成功。最後讓Convert
返回一個布爾值來知道它是否成功。
但至少可以看到,進行轉換時不再需要string key
,它可能會讓您感興趣。 您還必須確保當您將它們傳遞給方法時,您的變量具有正確的類型,否則您將搜索錯誤的鍵。
思考解決方案:
通過上述方法,你可以做這樣的事情:
static void Main(string[] args)
{
object[] parameters = new object[] { "false", true };
typeof(Program).GetMethod("Convert")
// Be sure that the types will create a valid key
.MakeGenericMethod(new Type[] { parameters[0].GetType(), parameters[1].GetType() })
// Change null to your instance
// if you are not calling a static method
.Invoke(null, parameters);
// parameters[1] is an out parameter
// then you can get its value like that
Console.WriteLine(parameters[1]);
Console.ReadKey();
}
具有屬性,看起來應該像這樣的:
object[] parameters = new object[]
{
propertyToRead.GetValue(objectToRead),
propertyToSet.GetValue(objectToSet)
};
typeof(MapperObject).GetMethod("Convert")
.MakeGenericMethod(new Type[]
{
propertyToRead.PropertyType,
propertyToSet.PropertyType
})
.Invoke(mapperInstance, parameters);
propertyToSet.SetValue(objectToSet, parameters[1]);
你可能需要稍微調整一下,因爲我沒有試圖編譯它
我能得到的解決方案,但我也不知道什麼是你的產業架構也沒怎麼你的Converter
作品。
您是否正在使用反射來設置其他模型的屬性(通過'SetValue')?反射通常與'對象'一起工作,所以類型安全不會購買任何東西。也就是說,你可以使用一個非泛型的'ModelFieldItem'和一個底層的'Func
此外,請查看'Convert.ChangeType'作爲爲每個屬性指定轉換器的替代方法 - 或者至少作爲默認實現。您可能還想查看Automapper,它專門用於映射屬性。 –
@TravisParks:感謝您的意見。我們需要我們的轉換器中的類型安全性:a)使實現更加清晰,b)在模型上設置正確的類型,而通過反思,我們仍然需要設置正確的類型,還是我錯誤了?使用委託的想法很好,我會嘗試。 – Phe0nix