假设我有一个这样的类:
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
?)
答案 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
,那么您应该只在第一次通话时遇到性能损失,因此费用应该可以忽略不计。