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

C# 扩展方法-如何在继承中返回正确的类型?,c#,extension-methods,C#,Extension Methods,我试图从我的存储库类创建一个通用方法。其思想是一个方法,它执行某些操作并返回调用它的类的实例 public class BaseRepository { } public class FooRepository : BaseRepository { } public class BarRepository : BaseRepository { } public static class ExtensionRepository { public static BaseReposito

我试图从我的存储库类创建一个通用方法。其思想是一个方法,它执行某些操作并返回调用它的类的实例

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;
    }
}
公共静态类扩展存储库
{
公共静态T AddParameter(此T self,字符串参数value),其中T:BaseRepository
{
//...
回归自我;
}
}

首先为什么要返回
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

+1,但是我们可以通过使用
where T:BaseRepository
来改进这一点,谢谢,Alex。我已经考虑过这个解决方案,但我想创建一个优雅的代码。类似于:“fooRepository.AddParameter(“value”)”而不是“fooRepository.AddParameter(“value”)”,你知道吗?@Kiwanax,你不需要在
中指定类型,它将由编译器推断。您的代码看起来像
fooRepository.AddParameter(“value”)
您是否意识到
class
类型变量只是对对象的引用?将相同的引用返回给方法的调用方的目的是什么?他已经有了那份证明。可能有一个合理的理由(这就是我问的原因)。添加:在上面的用法示例中,
=
符号只是将相同的引用分配给新变量。这不是一个“错误的例子”。该方法不创建新实例;返回相同的引用Jeppe的目的是实现对一行的大量方法调用。“错误实例”是一种表示我希望子实例返回的方式,但不是基类,你知道吗?现在我明白了。我猜正确的术语是“错误(不需要的)编译时类型”或“变量类型”。返回同一个实例的目的是调用一行中的许多方法,你知道吗?例如:“fooRepository.AddParameter(“”).AddSomeStuff(“,”).AddAnotherStuff(“”.List();”)。像这样的。@Kiwanax好吧,那么你可以使用另一个答案的解决方案。是的,@Jeppe,另一个解决方案解决了我的问题。谢谢你的回答!