假设我有这个课程
public Holder<T> : IHolder
{
private mystring;
private myobj;
public Holder(T obj, string str)
{
mystring = str;
myobj = obj;
}
}
然后我想拥有Holder&lt; T&GT;延长T,这样我就可以使用Holder&lt; T&GT;正如我所说的那样。有没有办法做到这一点?
所以对于例如,我想要Holder&lt; INT&GT;被视为一个int。
只是添加:T不起作用,但如果有另一种方法,我很好奇。
隐式转换不起作用,因为我希望能够进入,例如IEnumerable&lt; INT&GT;
答案 0 :(得分:4)
在.NET中实现泛型的方式要求所有Foo<T>
必须以大致相同的方式运行,而不管T
。除其他事项外,所有Foo<T>
必须具有相同的成员,仅保留成员在其定义中可能包含T
的事实。如果Foo<T>
可以从T
继承,那么了解Foo<T>
成员所揭示的内容需要了解T
成员所展示的内容,这对于Foo<Automobile>
来说当然可能完全不同和Foo<Cat>
。如果知道Foo<T>
仅用于从例如Animal
派生的类型class Foo<T> : Animal where T:Animal
,可以定义Foo<Cat>
,但只允许将Animal
用作Cat
- 而不是Foo<T>
。
然而,在许多情况下,真正需要的不是实际继承T
的类型T
,而是创建大部分行为类似myProxyMaker.Create<IFoo>(IFlyingMammal)
的对象的能力,但是有一些差异。 .NET Framework不允许直接完成,但有一些库可以为此目的自动生成代理对象。给定一个接口和一个或多个对象,每个对象实现一些接口成员,并共同实现所有这些对象,代理生成器将创建(在运行时!)一个新类,该类保存对提供的对象的引用并实现该接口通过为每个接口方法创建一个类方法,该方法链接到其中一个传入对象上的相应方法。
请注意,尽管创建这些新类的方法是通用的,但类本身不会是通用的。可能proxy8675309
返回myProxyMaker.Create<ISwimmingMammal>
而proxy24601
返回IFlyingMammal
。因为它们是完全不同的类,ISwimmingMammal
与proxy8675309
具有不同成员的事实不会产生任何问题。类可能具有丑陋的机器生成名称的事实并不重要,因为不会声明类型为proxy24601
或IFlyingMammal
的变量,而是类型ISwimmingMammal
和{{ 1}}。