如何在泛型方法中使用泛型类型

时间:2009-01-17 03:37:14

标签: c# generics

已编辑以显示真实示例

如何从传递给函数的泛型类型中调用泛型函数?这似乎应该是直观的,但我似乎无法让它发挥作用。

例如,我可以在下面的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>();
    }
}

}

4 个答案:

答案 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,