扩展方法-如何在继承中返回正确的类型

本文关键字:返回 类型 继承 方法 扩展 | 更新日期: 2023-09-27 18:08:34

我试图从我的存储库类创建一个通用方法。其思想是一个方法,做一些事情并返回调用它的类的实例。

public class BaseRepository { }
public class FooRepository : BaseRepository { }
public class BarRepository : BaseRepository { }
public static class ExtensionRepository
{
    public static BaseRepository AddParameter(this BaseRepository self, string parameterValue)
    {
        //...
        return self;
    }
}
// Calling the test:
FooRepository fooRepository = new FooRepository();
BaseRepository fooWrongInstance = fooRepository.AddParameter("foo");
BarRepository barRepository = new BarRepository();
BaseRepository barWrongInstance = barRepository.AddParameter("bar");

这样我就可以得到BaseRepository实例。但我需要得到调用这个功能的FooRepository和BarRepository实例。任何想法?非常感谢!!

扩展方法-如何在继承中返回正确的类型

您可以尝试使用泛型

public static class ExtensionRepository
{
    public static T AddParameter<T>(this T self, string parameterValue) where T:BaseRepository 
    {
        //...
        return self;
    }
}

为什么首先要返回self ?据我所知(不知道你的方法体里面有什么),你没有给self分配一个新对象。所以你返回的是调用者已经拥有的同一个实例。

也许你可以让它返回void:

public static void AddParameter(this BaseRepository self, string parameterValue)
{
    //...
}

用法:

FooRepository fooRepository = new FooRepository();
fooRepository.AddParameter("foo");
// fooRepository is still fooRepository after the call

BarRepository barRepository = new BarRepository();
barRepository.AddParameter("bar");
// barRepository is still barRepository after the call