簡體   English   中英

c# 基礎 class 方法返回派生的 class

[英]c# base class method returns derived class

所以我有一個應用程序調用一個LOAD的 WebServices,所有這些都有一個響應 class,每個響應 class 都來自 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() 方法。 我幾乎用基礎 class 中的通用 WithSuccess() 方法到達那里,但它返回基礎 class,而不是派生的 class,這意味着我有這個雙重考慮:

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

任何方式我都可以告訴編譯器推斷是什么,或者有更好的方法來做到這一點?

使用像這樣的通用擴展方法應該可以工作:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM