已编辑以显示真实示例
如何从传递给函数的泛型类型中调用泛型函数?这似乎应该是直观的,但我似乎无法让它发挥作用。
例如,我可以在下面的LocalDataObjectEngine中调用cache.ResetCache()函数吗?
我得到的错误是'Type T不能用作参数'
public interface ISimpleCache<T1>
{
...
void ResetCache<T>() where T : T1;
}
internal class LocalDataObjectEngine_Cache : ISimpleCache<IBrokeredDataObject>
{
ISimpleCache<IBrokeredDataObject> _cache;
...
public void ResetCache<T>() where T : IBrokeredDataObject
{
//logic here
}
...
}
public partial class LocalDataObjectEngine : IEngine
{
ISimpleCache<IBrokeredDataObject> _cache = new LocalDataObjectEngine_Cache();
public void ResetCache<T>() where T : IBrokeredDataObject
{
_cache.ResetCache<T>();
}
}
}
答案 0 :(得分:1)
除非你的IBrokeredDataObject
定义中有什么内容,否则我不确定会发生什么。你所写的内容看起来是正确的并且对我来说很好。
[已编辑以匹配OP中的编辑]
答案 1 :(得分:1)
首先,为什么需要在方法中指定泛型类型?该类已经指定了泛型类型,您可以在方法中访问它:
public interface ISimpleCache<T1>
{
...
void ResetCache();
}
使实现接口的类更简单:
internal class LocalDataObjectEngine_Cache : ISimpleCache<IBrokeredDataObject>
{
ISimpleCache<IBrokeredDataObject> _cache;
...
public void ResetCache();
{
//logic here with access to IBrokeredDataObject if needed
}
...
}
最后一种方法也是如此,只需调用
即可_cache.ResetCache();
但是,如果由于某种原因确实需要在方法中指定泛型类型,请执行以下操作
让我们开始吧:
为什么不在方法中使用T1而不是指定T应该像T1?
public interface ISimpleCache<T1>
{
...
void ResetCache<T1>();
}
在LocalDataObjectEngine_Cache中,您不必再次指定T,只需使用IBrokeredDataObject(如果您没有实现该方法,并右键单击接口名称以选择“实现接口”,它会将其写为下面:
internal class LocalDataObjectEngine_Cache : ISimpleCache<IBrokeredDataObject>
{
ISimpleCache<IBrokeredDataObject> _cache;
...
public void ResetCache<IBrokeredDataObject>();
{
//logic here
}
...
}
然后从上一课开始,通过指定你希望T的实际课程再次调用它:
public partial class LocalDataObjectEngine : IEngine
{
ISimpleCache<IBrokeredDataObject> _cache = new LocalDataObjectEngine_Cache();
public void ResetCache<IBrokeredDataObject>()
{
_cache.ResetCache<IBrokeredDataObject>();
}
}
答案 2 :(得分:1)
删除了...,对IEngine的引用,并提供了一个空的IBrokeredDataObject接口,您的代码编译没有任何问题。
请提供不编译的简短但完整的示例。理想情况下,创建一个包含单个文件的新项目,将所有代码放在那里,并使其尽可能简单,同时显示相同的错误。然后剪切并粘贴到这里。这样我们就不需要修复“...”等或删除对我们没有声明的接口的引用。
答案 3 :(得分:1)
发现它,Jon Skeet提到删除IEngine指向我正确的方向,有一个
void ResetCache<T>() where T : IDataObject
IE上的(IDataObject是IBrokeredDataObject的基础),我改为
void ResetCache<T>() where T : IBrokeredDataObject
感谢大家容忍我的错误,给大家+1,