【问题标题】:How do I convert a dynamically typed object to a type argument <T> in C#?如何在 C# 中将动态类型对象转换为类型参数 <T>?
【发布时间】:2020-07-25 21:24:13
【问题描述】:

我已经搜索了几个小时,还发现了各种 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 expression builders 但我不确定如何在这个用例中做到这一点。这个 SO 答案提到了dynamic typing,但这不是我需要的。

编辑: linked "duplicate" question 很接近,但它只处理常规方法参数的动态转换泛型类型,但不处理我需要的 TYPE 参数。

【问题讨论】:

标签: c# .net generics dynamic casting


【解决方案1】:

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

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 方法的实例以及包含该方法的类型。

【讨论】:

  • 你是个天才!非常感谢!
  • 不客气!那些接近的投票真的激励了我回答这个问题。 ;)
  • 你太棒了。保持真棒!
猜你喜欢
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多