c#基类方法返回派生类

时间:2021-01-28 17:30:58

标签: c# generics inheritance

所以我有一个应用调用了一个LOAD的WebServices,所有的WebServices都有一个响应类,每个响应类都派生自ResponseBase

public abstract record ResponseBase<T>
{
    public HashSet<string> ErrorMessages { get; set; }

    public bool Success { get; set; }

    public virtual string Message => Success ? "Success" : string.Join(", ", ErrorMessages);

    public IEnumerable<T> Results { get; set; }
    public T Result { get; set; }
}

现在我创建了这样的新回复:

var results = SomeService.GetSomeResults();
return new SomeDerivedResponse() { Success = true; Results = results }

为了简洁、清晰、一般代码清洁,我喜欢做的更像是:

var results = SomeService.GetSomeResults();
return new SomeDerivedResponse().WithSuccess(results);

WithSuccess() 只会相应地分配 Success = true 和 Results = results

不必在每个派生的响应类(有数百个)中放置相同的 WithSuccess() 方法。我几乎在基类中使用通用 WithSuccess() 方法到达那里,但它返回基类,而不是派生类,这意味着我有双重考虑:

return new SomeDerivedResponse().WithSuccess<SomeDerivedResponse>(results);

有什么办法可以告诉编译器推断是什么,还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

使用这样的通用扩展方法应该可以:

public static class Ext
{
    public static T WitSuccess<T, R>(this T t, IEnumerable<R> r) where T : ResponseBase<R>
    {
        // your logic here
        return t;
    }

    public static T WitSuccess<T, R>(this T t, R r) where T : ResponseBase<R>
    {
         // your logic here
        return t;
    }
}

和用法:

public record SomeDerivedResponse : ResponseBase<int>{}
public record SomeDerivedResponse1<T> : ResponseBase<T>{}

new SomeDerivedResponse().WitSuccess(new []{1});
new SomeDerivedResponse1<int>().WitSuccess(1);
相关问题