类似的工作方式:
object myObjet = GetObject();
Type myType = GetType();
var x = ConvertToType(myObject, myType);
myobject可以是原始图元或其他形式。如果无法进行转换,则会引发异常。框架中是否内置了某些内容。 System.Convert类要求您知道目标类型。
答案 0 :(得分:0)
您可以准确地编写您要描述的方法。可能看起来像这样:
object ConvertToType(object source, Type targetType)
{
var sourceType = source.GetType();
if (sourceType == typeof(Something) && targetType == typeof(SomethingElse))
{
// call some function that takes the input and converts it to the output type.
return ConvertSomethingToSomethingElse((Something) source);
}
// Repeat the above, over and over. Every time there's a new type conversion,
// add it.
throw new Exception($"Can't convert {sourceType} to {targetType}");
}
如果有很多可能的转换,这可能很难看。 (在该方法有意义的情况下,是否存在大量的转换?我倾向于不这样做,但这是一种看法。)
您可以使用Automapper。您的方法如下所示:
object ConvertToType<T>(object source, Type targetType)
{
return Mapper.Map(source, source.GetType(), targetType);
}
您仍然必须配置所有映射,并在某些情况下编写函数以执行您要支持的转换的所有可能组合。没有解决的办法。
这两种方法都说明,答案是“是的,你可以做到”,但没有免费的午餐。无论如何分割,您都仍然必须编写代码来处理所有转换。如果您已经做完所有这些,将所有这些都通过一个方法传递是否有意义?可能存在某些情况(或者甚至没有Map
重载的情况),但是在大多数情况下,我怀疑这样做是否有帮助。
我一般不建议使用这种模式,因为它暗示了不安全类型的代码将调用此方法,并且结果是object
也不安全。如果可能的话,由于您仍然必须编写类型安全的代码来进行转换,因此我将直接使用这些方法,而不是使用object
。