我想将对象的实例转换为仅在运行时已知的类型的实例

时间:2019-06-26 14:49:23

标签: c#

类似的工作方式:

object myObjet = GetObject();
Type myType = GetType();

var x = ConvertToType(myObject, myType);

myobject可以是原始图元或其他形式。如果无法进行转换,则会引发异常。框架中是否内置了某些内容。 System.Convert类要求您知道目标类型。

1 个答案:

答案 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