没有类型可以使用泛型吗?

时间:2014-02-25 18:41:44

标签: c# generics

假设我有一个这样的类:

public class MyClass<T> where T : BaseClass, new()
{
    public Boolean DoWork()
    {
        // do the work, obviously.
    }
}

在某些方法中,我需要DoWork() MyClass<T>,我不需要知道T。据我所知,我需要引用我的MyClass<T>参数并重申T的约束,如下所示:

public void DoLotsOfWork(MyClass<T> item) where T : BaseClass, new()
{
    // do some work

    // no need to know what T is here:
    item.DoWork();

    // maybe do some other work.
}

方法DoLotsOfWork()可以引用MyClass<T> 而不重复T上的约束吗?(或者甚至可能知道T?)

3 个答案:

答案 0 :(得分:2)

处理此问题的方法是使DoLotsOfWork通用。

public void DoLotsOfWork<T>(MyClass<T> item) where T : BaseClass, new()
{
    // do some work

    // no need to know what T is here:
    item.DoWork();

    // maybe do some other work.
}

您不能引用MyClass类型,并且不提供任何通用参数,也不能访问特定于该类型的任何信息。 (至少不使用静态类型;你需要转向像反射这样的东西。)

答案 1 :(得分:2)

如果您可以更改MyClass<T>类定义,那么您可以从非泛型基类派生它,该基类将您的方法指定为抽象:

public abstract class MyClassBase
{
    public abstract Boolean DoWork();
}

public class MyClass<T> : MyClassBase where T : BaseClass, new()
{
    public override Boolean DoWork()
    {
        // do the work, obviously.
    }
}

然后,使用此基类作为参数类型:

public void DoLotsOfWork(MyClassBase item)
{
    item.DoWork();
}

此方法用于.NET Framework,其中Task<Result>派生自Task。后者包含不依赖于泛型类型的成员,例如Wait()

答案 2 :(得分:0)

您可以将参数声明为dynamic

public void DoLotsOfWork(dynamic item)
{
    // do some work

    // no need to know what T is here:
    item.DoWork();

    // maybe do some other work.
}

使您的代码更漂亮,但there is a performance hit。但是,如果您在应用的生命周期中多次拨打DoLotsOfWork,那么您应该只在第一次通话时遇到性能损失,因此费用应该可以忽略不计。