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

C# 如何在泛型方法中使用泛型类型,c#,generics,C#,Generics,编辑以显示真实示例 如何从传递给函数的泛型类型调用泛型函数?这似乎应该是直观的,但我似乎无法让它工作 例如,我可以调用下面LocalDataObjectEngine中的cache.ResetCache()函数吗 我得到的错误是“类型T不能用作参数” public interface ISimpleCache<T1> { ... void ResetCache<T>() where T : T1; } internal class LocalDat

编辑以显示真实示例

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

例如,我可以调用下面LocalDataObjectEngine中的cache.ResetCache()函数吗

我得到的错误是“类型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>();
    }
}

}
公共接口是简单缓存
{    
...
void ResetCache(),其中T:T1;
}
内部类LocalDataObjectEngine\u缓存:ISimpleCache
{
ISimpleCache\u cache;
...
public void ResetCache(),其中T:IBrokeredDataObject
{
//这里的逻辑
}
...
}
公共部分类LocalDataObjectEngine:IEEngine
{
ISimpleCache_cache=新的LocalDataObjectEngine_cache();
public void ResetCache(),其中T:IBrokeredDataObject
{
_ResetCache();
}
}
}

除非您对
IBrokeredDataObject
的定义中有什么内容,否则我不确定发生了什么。你写的看起来不错,对我来说很好


[编辑以匹配OP中的编辑]

首先,为什么需要在方法中指定泛型类型?该类已指定泛型类型,您可以在方法中访问它:

public interface ISimpleCache<T1>
{    
    ...
    void ResetCache();
}
但是,如果出于某种原因确实需要在方法中指定泛型类型,请执行以下操作


让我们开始:

为什么不在方法中使用T1,而不是指定t应该像T1一样

public interface ISimpleCache<T1>
{    
    ...
    void ResetCache<T1>();
}
公共接口是简单缓存
{    
...
void ResetCache();
}
在LocalDataObjectEngine_缓存中,您不必再次指定t,只需使用IBrokerdDataObject(如果您没有实现该方法,右键单击接口名称选择“实现接口”,它将按如下方式编写:

internal class LocalDataObjectEngine_Cache : ISimpleCache<IBrokeredDataObject>
{
    ISimpleCache<IBrokeredDataObject> _cache;

    ...

    public void ResetCache<IBrokeredDataObject>();
    {
        //logic here
    }

    ...
}
内部类LocalDataObjectEngine\u缓存:ISimpleCache
{
ISimpleCache\u cache;
...
public void ResetCache();
{
//这里的逻辑
}
...
}
然后,在上一个类中,通过指定您想要成为的实际类再次调用它:

public partial class LocalDataObjectEngine : IEngine
{
    ISimpleCache<IBrokeredDataObject> _cache  = new LocalDataObjectEngine_Cache();

    public void ResetCache<IBrokeredDataObject>()
    {
        _cache.ResetCache<IBrokeredDataObject>();
    }
}
公共部分类LocalDataObjectEngine:IEEngine
{
ISimpleCache_cache=新的LocalDataObjectEngine_cache();
公共void ResetCache()
{
_ResetCache();
}
}

删除对IEEngine的引用…,并提供一个空的IBrokeredDataObject接口后,代码编译不会出现任何问题


请提供一个不编译的简短但完整的示例。理想情况下,使用单个文件创建一个新项目,将所有代码放在其中,并使其尽可能简单,同时显示相同的错误。然后只需剪切并粘贴到此处。这样我们就不需要修复“…”etc或删除对我们没有声明的接口的引用。

找到了它,Jon Skeet对删除IEngine的引用为我指明了正确的方向,有一个

void ResetCache<T>() where T : IDataObject
void ResetCache(),其中T:IDataObject
在IEngine上(如果IBrokeredDataObject,IDataObject是一个基),我改为

void ResetCache<T>() where T : IBrokeredDataObject
void ResetCache(),其中T:IBrokeredDataObject

感谢大家容忍我的错误,+1对大家来说

我想区分T1作为缓存基本对象和T作为从T派生的类型化对象,因为缓存中可能存在0-n种不同类型的对象,都是IBrokeredDataObject的派生对象,但我想指定一种要刷新的类型。因此重置Res的缓存etCache无法满足我的要求,因为我无法告诉引擎从缓存中删除所有“DerivedDataObjectType1”而不是“DerivedDataObjectType2”。只要您的类实现了IBrokeredDataObject,您就可以在声明_cache对象时使用它。ISimpleCache(U cache=new)将起作用。谢谢,我已经发布了答案,它是你提到的IEngine帮我找到了罪犯
void ResetCache<T>() where T : IDataObject
void ResetCache<T>() where T : IBrokeredDataObject