簡體   English   中英

用於公開非泛型和泛型類的模式

[英]Pattern for exposing non generic and generic Class

我已經為我的方法實現了一個通用的操作結果,它看起來像這樣

public class OperResult
{
    public string ErrorCode { get; private set; }
    public string Message { get; private set; }
    public object Data { get; private set; }
    public bool Ok { get; private set; }
    public string IncidentNumber { get; set; }

    public static OperResult Success(Object data = null)
    {
        return new OperResult(data);
    }
}

和使用泛型相同的操作結果

public class OperResult<T>
{
    public string ErrorCode { get; private set; }
    public string Message { get; private set; }
    public T Data { get; private set; }
    public bool Ok { get; private set; }
    public string IncidentNumber { get; private set; }

    public static OperResult<T> Success(T data = null)
    {
        return new OperResult<T>(data);
    }
}

有沒有辦法將這兩種實現結合起來,同時提供此類的通用和非通用版本?


編輯添加有關類型用法的更多信息:

我想輕松創建返回此類型的函數,例如我希望能夠創建以下函數:

OperResult MakeAction()
OperResult<int> GetCount()

如果我使用繼承OperResult:OperResult<Object>然后OperResult.Suceess()將產生OperResult<Object>並且以下將產生編譯錯誤:

OperResult MakeAction(){
  return OperResult.Suceess(); //Cannot convert OperResult<Object> to OperResult
}

OperResult GitHub 鏈接

正如評論中已經提到的,非通用似乎是一個OperResult<object>

最初沿着這條路線走,但事實證明它不適合所需的用例。 將其切換為讓泛型從非泛型派生並提供新的 Data 屬性。

public class OperResult {

    protected OperResult(object data) {
        this.Data = data;
    }

    public string ErrorCode { get; protected set; }
    public string Message { get; protected set; }
    public object Data { get; protected set; }
    public bool Ok { get; protected set; }
    public string IncidentNumber { get; protected set; }

    public static OperResult Success(object data = null) {
        return new OperResult(data ?? new object());
    }

    public static OperResult<T> Success<T>(T data) {
        return new OperResult<T>(data);
    }
}

public class OperResult<T> : OperResult {

    public OperResult(T data)
        : base(data) {
    }

    public new T Data { get; protected set; }
}

這允許以下語法

int data = 10;
var result = OperResult.Success(data);
//result is OperResult<int>

暫無
暫無

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

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