我想创建一个具有泛型类型参数的类,该类具有作为另一个泛型类的子类的约束。
示例:
public class SomeGeneric<T> where T : new()
{
T CreateItem() => new T();
}
我要创建这个类。注意:我不希望此类的客户端指定内部类型参数两次:
public class TheClass<TGeneric> where TGeneric : SomeGeneric<T>, new()
{
public T Item {get; private set;}
public void TheClass
{
var instance = new TGeneric(); // this is possible because of the new() restriction
Item = instance.CreateItem();
}
}
然后可以按如下方式使用:
class AnotherClass
{
}
class Client : TheClass<SomeGeneric<AnotherClass>>
{
public void SomeMethod()
{
var theInstanceOfAnotherClass = this.Item;
// Do stuff with it
}
}
据我所知,这是不可能的,因为它在这一行抱怨T
未知:
public class TheClass<TGeneric> where TGeneric : SomeGeneric<T>, new()
解决方法如下:
public class TheClass<T, TGeneric> where TGeneric : SomeGeneric<T>, new()
但这意味着客户必须这样做:
public class Client : TheClass<AnotherClass, SomeGeneric<AnotherClass>>
我想避免重复内部类型参数。这可能吗?
答案 0 :(得分:1)
我不认为这是可能的。 This question解决了同样的问题。
来自MSDN的这个模糊也表明它不允许,与C ++不同。我不确定是否有这种限制的原因。
在C#中,泛型类型参数本身不能是通用的,尽管构造的类型可以用作泛型。 C ++确实允许模板参数。
我认为你必须以某种方式重写你的类以使用泛型object
,否则只需使用重复类型参数。
答案 1 :(得分:-1)
这是否有效甚至与您想要的相似?
public SomeClass<TGeneric<T>> where TGeneric<T> : SomeGeneric<T>