C# 泛型方法,可以从泛型类型的类型定义中推断参数的类型吗?

标签 c# .net generics

有没有办法让下面的(不是编译的)代码运行起来?我还没有找到解决方案。

public class Factory{
    public static T Get<T>(V v)
        where T : BaseClass<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}

T 是一个普通的泛型类型参数,用于定义泛型方法“Get”,但有一个包含泛型本身的类型约束。 现在该方法应该定义一个参数,该参数的类型由该方法的泛型类型参数定义的泛型类型参数定义。
BaseClass 将定义一个方法 Set 接收其泛型类型参数类型的参数。
这意味着应该可以调用 Factory.Get<A<B>>(someObjectCastableToB); .

它可以通过将方法 Get 定义为 Get 并在 V 上加上另一个约束来工作。但是调用将是 Factory.Get<A<B>,B>(....)这不太好,因为 B 的声明有两次。

谢谢!

最佳答案

与 C++ 模板不同,您可以在其中拥有 "template templates""partial specialization" , C# 泛型参数只能深入声明位置,而泛型约束只能告诉你沿袭,仅此而已。如果您希望能够引用您的通用参数之一的通用参数,那么唯一的方法就是像您在示例中那样,通过对继承沿袭的通用约束( T : BaseClass<V> ),然后 V还必须在通用签名中标识。你需要像下面这样的东西。

public class Factory{
    public static T Get<T, V>(V v)
        where T : BaseClass<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}

我在这里添加的只是方法签名的通用参数 V。同样,如果您没有将 V 锚定到的基类,您将无法对您的情况做太多事情。例如,如果 T 本身的运行时类型是通用的,而不是它的基类,那么您将陷入困境,如以下示例所示,它将无法编译。

public class Factory{
    public static T Get<T, V>(V v)
        where T : T<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}

关于C# 泛型方法,可以从泛型类型的类型定义中推断参数的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7176302/

相关文章:

c# - 返回 IEnumerable 和调用 ToArray 时的 LINQ 意外行为

.net - 在 WPF 和 Silverlight 中的静态属性上实现 INotifyProperty 更改

swift - 词典的专门扩展

scala - Scala中的映射类型

java - 如何将 'cast' 转换为通用对象并使用通用参数执行方法

c# - 甲骨文 SQL : Selecting a single row with the latest date between multiple columns

c# - 如果我有 Console.ReadLine();,Windows 调度程序将如何 react ?在我的控制台应用程序中

c# - WPF Prism 将 View 加载到区域,以前的 View 不会被删除

c# - 如果从同一个线程调用 Dispatcher.BeginInvoke 是否会将调用排队?

c# - Windows 工作流中的拦截/装饰事件