【发布时间】:2015-01-30 22:38:56
【问题描述】:
我正在尝试写一些东西,但我遇到了死胡同。我有以下代码:
public class ObjectConverter
{
private Dictionary<Type, object> m_Conversions = new Dictionary<Type, object>();
public void AddConversion<TOut>(Func<object, TOut> conversion)
{
m_Conversions[typeof(TOut)] = conversion;
}
public T Convert<T>(object value)
{
var conversion = (Func<object, T>) m_Conversions[typeof(T)];
return conversion(value);
}
}
这是对真实事物的简化,但基本上它允许将对象转换为我们为其定义了转换的任何类型。 这样你就可以做类似的事情:
// Intialization
converter.AddConversion(x => Convert.ToInt32(x));
// Some other place
converter.Convert<int>("12");
到目前为止一切都很好,但复杂的是我想写一个非通用的转换版本
object Convert(object value, Type type)
{
var conversion = m_Conversions[type];
// ???
}
我该怎么做?我想过做类似的事情:
object Convert(object value, Type type)
{
var conversion = m_Conversions[type];
var funcType = typeof(Func<,>).MakeGenericType(typeof(object), type);
var invoke = funcType.GetMethod("Invoke");
return invoke.Invoke(conversion, new object[] { value });
}
但它似乎非常低效。你能想出更好的方法吗?
【问题讨论】:
-
为什么你认为它效率低?
-
因为反射。它可能没有现在那么糟糕,但我想知道是否有更好的方法来解决它,结果证明是有的。
标签: c# reflection func