如何在 C# 中将动态类型化对象转换为类型参数<T>?



我在谷歌上搜索了几个小时,也发现了各种stackoverflow问题,但没有一个能满足我的确切用例。这就是我所拥有的:一个采用2个泛型类型参数的方法。该库是封闭源代码,所以我无法修改它。方法签名看起来像:

TTo Convert<TFrom, TTo>(TFrom obj)

然而,当你调用这个时,你总是必须提供两个类型参数,比如:

Convert<Dog, Cat>(dog);

我试图支持一个只提供目的地类型参数的用例:

Convert<Cat>(dog);

所以我需要的方法签名如下:

TTo Convert<TTo>(object obj){
var TFrom = obj.GetType();
Convert<TFrom, TTo>((TFrom)obj); // <--- throws an error right here
}

你能帮我修一下吗?这个SO答案提到使用Lambda表达式构建器,但我不确定在这个用例中如何做到这一点。这个SO答案提到了动态打字,但这不是我在这里需要的。

编辑:链接的"重复"问题很接近,但它只处理常规方法参数的动态转换泛型类型,而不处理我所需要的TYPE参数。

这可以通过反射来实现。您只需要构造一个应用了类型参数的方法。

class Program
{
public static TTo Convert<TFrom, TTo>(TFrom obj)
{
Console.WriteLine($"I was called with {obj}");
return default;
}
public static TTo ConvertObject<TTo>(object obj)
{
var method = typeof(Program).GetMethod(nameof(Convert));
var specialized = method.MakeGenericMethod(new[] { obj.GetType(), typeof(TTo) });
return (TTo) specialized.Invoke(null, new[] { obj });
}
}

用法:

ConvertObject<int>(1.0f); //prints I was called with 1

传递null是因为该方法是静态的;应替换为包含Convert方法的实例以及包含该方法的类型。

最新更新