繁体   English   中英

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

[英]C# generic methods, possible to infer type for parameters from generic type's type definition?

有什么方法可以使以下(未编译)代码运行? 我还没有找到解决方案。

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 as Get定义为V并在V上施加另一个约束将可以工作。但是随后的调用将是Factory.Get<A<B>,B>(....) ,因为B的声明不是那么好有两次。

谢谢!

与C ++模板(可以具有“模板模板”“部分专业化”)不同 ,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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM