泛型函数正确用法?

时间:2018-08-19 07:59:08

标签: c# generics

我是这个站点的新用户,我有一个存储库模式,如果您检查下面的代码,则在这里定义了返回类型和参数T,将通过调用方法来实现,因此在运行时它将被{{1}替换},参数将被更改为字符串,int或bool,但是下面将无法编译,但是我需要使其工作,请帮助,替代方法也将工作。

SomeClass

冗余方法:

public interface IBaseRepository
{
    Task<T> Add<T>(T value,string typeName);
}

public class Test: IBaseRepository
{
    public Task<SomeClass> Add<SomeClass>(string value, string typeName)
    {
        throw new NotImplementedException();
    }

    public Task<SomeClass> Add<SomeClass>(int value, string typeName)
    {
        throw new NotImplementedException();
    }

    public Task<SomeClass> Add<SomeClass>(bool value, string typeName)
    {
        throw new NotImplementedException();
    }
}

3 个答案:

答案 0 :(得分:0)

我确定未实现接口会给您带来错误。

  1. 根据您的界面 任务Add(T值,字符串类型名称);

    如果您正确看待的话,那么通用类型T必须返回类型任务,并且应该以与添加函数相同的方式输入。

  2. 现在来看一下实现

    您的方法都不满足接口。例如

    公共任务添加(字符串值,字符串typeName)

    这里T是SomeClass,所以方法的第一个参数必须为SomeType类型。

更新1:我会做这样的事情。

public interface IBaseRepository<T,U,V>
{
    Task<V> AddData(T namespaceName, U typeName);
}

public class SomeClass
{

}

public class Test : IBaseRepository<string, string, SomeClass> , IBaseRepository<int,string,SomeClass>
{
    public Task<SomeClass> AddData(int namespaceName, string typeName)
    {
        throw new NotImplementedException();
    }

    public Task<SomeClass> AddData(string namespaceName, string typeName)
    {
        throw new NotImplementedException();
    }
}

答案 1 :(得分:0)

public interface IBaseRepository<E>
{
    Task<T> Add<T>(E value,string typeName);
}

public class Test: IBaseRepository<SomeDefinedClass>
{
    public Task<SomeClass> Add<SomeClass>(SomeDefinedClass value, string typeName)
    {
        throw new NotImplementedException();
    }
}

这里是解决问题的方法,但是在如何将其用于存储库模式方面仍然存在问题。

答案 2 :(得分:0)

这看起来更像您的追求吗?

public interface IBaseRepository<R>
{
    Task<T> Add<T>(R value, string typeName);
}

public class Test<R> : IBaseRepository<R>
{
    public Task<T> Add<T>(R value, string typeName)
    {
        throw new NotImplementedException();
    }
}

您只需实施一次该方法。您只需为要运行的每个Test<R>创建一个新的R