【问题标题】:Generic function return value can not be specified creating generic methods创建泛型方法时无法指定泛型函数返回值
【发布时间】:2012-12-15 18:22:23
【问题描述】:

我有这个方法需要将 int 值列表转换为适当的枚举值列表。

问题是 Select 正在返回一个对象类型,因为我没有为泛型函数指定返回类型,因为返回类型也是泛型的。

    public static Tout Convert<Tout, Tin>(IList<Tin> reply)
    {
        Type resultListElementType = typeof(Tout).GetGenericArguments()[0];
        MethodInfo setEnumValueMethod = typeof(EnumUtils).GetGenericMethod("SetEnumValue", new Type[] { typeof(Tin) });
        MethodInfo setEnumValueGenericMethod = setEnumValueMethod.MakeGenericMethod(resultListElementType, typeof(Tin));
        Tout result = (Tout)(dynamic)reply.Select(v => setEnumValueGenericMethod.Invoke(null, new object[] { v })).ToList();
        return result;
    }

通用函数签名如下

    public static Tout SetEnumValue<Tout, Tin>(Tin value)

有什么方法可以配置泛型函数的返回类型吗?

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    你已经在这样做了。您将TIn 绑定到typeof(Tin)。问题出在其他地方:

    Tout result = (Tout)(dynamic)reply.Select(v => setEnumValueGenericMethod.Invoke(null, new object[] { v })).ToList();
    

    这会给你一个List&lt;object&gt;。将每个单独的值转换为正确的类型:

    List<Tout> result = reply.Select(v => (Tout)(dynamic)setEnumValueGenericMethod.Invoke(null, new object[] { v })).ToList();
    

    然后改变 public static Tout Convert(IList 回复)

     public static List<Tout> Convert<Tout, Tin>(IList<Tin> reply)
    

    【讨论】:

    • Tout 有问题。我正在寻找一种使用 RETURN 类型制作通用函数的方法。通过更改转换,我将问题移出一个级别,但并没有为我解决它。我达到了无法控制 API 的地步,因此我需要能够指定返回类型。我知道我正在绑定输入参数。
    • Tout(在未更改的签名中)在运行时是否总是List?在那种情况下,我们实际上需要重新插入你最初所做的演员阵容,而我已经搬进了 Select。无论如何,这是一件肮脏的事情。我想知道你需要这个黑客做什么?
    • 真正的问题是通过反射调用不适当地支持返回类型,并且只返回对象,因此需要强制转换。
    • 我正在使用的 APi 采用包含列表的泛型,或者可能没有,因为它也可能只是一个普通对象甚至是字典。试图利用它创建一定程度的泛型会引起混乱。我最终采用了您的解决方案并拦截了呼叫并分别处理列表处理。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多