0

假设我有这门课

public Holder<T> : IHolder
{
    private mystring;
    private myobj;

    public Holder(T obj, string str)
    {
        mystring = str;
        myobj = obj;
    }
}

然后我想让 Holder<T> 扩展 T,这样我就可以像使用普通 T 一样使用 Holder<T>。有没有办法做到这一点?

因此,例如,我希望 Holder< int> 被视为 int。

只是添加 :T 不起作用,但我很好奇是否还有其他方法。

隐式转换不起作用,因为我希望它能够进入,例如 IEnumerable< int>

4

1 回答 1

4

在 .NET 中实现泛型的方式要求Foo<T>无论T. 除其他外,所有成员都Foo<T>必须具有相同的成员,只是成员可以包含T在其定义中。如果Foo<T>可以继承自T,那么知道暴露了哪些成员Foo<T>就需要知道暴露了哪些成员,这对于 a和 aT当然可能完全不同。如果知道这将仅用于派生自 eg 的类型,则可以定义 a ,但这仅允许将 a用作 -- 而不是用作 a 。Foo<Automobile>Foo<Cat>Foo<T>Animalclass Foo<T> : Animal where T:AnimalFoo<Cat>AnimalCat

然而,在许多情况下,真正需要的不是Foo<T>实际继承的类型T,而是能够创建一个行为大多类似于T,但有一些差异的对象。.NET Framework 也不允许直接执行此操作,但有一些库可以为此目的自动生成代理对象。给定一个接口和一个或多个对象,每个对象都实现一些接口成员,并且共同实现所有这些成员,代理生成器将创建(在运行时!)一个新类,该类包含对提供的对象的引用并实现该接口通过为每个接口方法创建一个类方法,该类方法链接到传入对象之一上的相应方法。

Note that although the method which creates these new classes will be generic, the classes themselves will not be. It may be that myProxyMaker.Create<IFoo>(IFlyingMammal) returns a proxy8675309 and a myProxyMaker.Create<ISwimmingMammal> returns a proxy24601. Because they are completely different classes, the fact that IFlyingMammal has different members from ISwimmingMammal would pose no problem. The fact that the classes might have ugly machine-generated names wouldn't really matter because one wouldn't be declaring variables of type proxy8675309 or proxy24601, but instead types IFlyingMammal and ISwimmingMammal.

于 2013-10-31T21:32:34.103 回答