代码之家  ›  专栏  ›  技术社区  ›  FerX32

来自参数的泛型T,而不是手动指定

  •  3
  • FerX32  · 技术社区  · 7 年前

    我写了这节课:

    public class ResultsPair<T>
    {
        public T Value { get; set; }
        public ResultsItem Result { get; set; }
    
        public ResultsPair(ResultsItem result, T value)
        {
            Result = result;
            Value = value;
        }
    
        public static ResultsPair<T> Create(ResultsItem result, T value)
        {
            return new ResultsPair<T>(result, value);
        }
    
        public static ResultsPair<T> CreateSuccess(T value) => Create(ResultsItem.Success(string.Empty), value);
        public static ResultsPair<T> CreateError(ResultsItem result) => Create(result, default(T));
    }
    

    我可以这样说:

    ResultsPair<User>.CreateSuccess(newUser);
    ResultsPair<User>.CreateError(ResultsItem.Error("A server connection error has occured."));
    

    在CreateError上,我可以手动定义T类,因为默认情况下它不会知道它。

    ResultsPair<User>.Create(ResultsItem, User) . 我不喜欢。 ResultsPair.Create(ResultsItem, User)

    1 回复  |  直到 7 年前
        1
  •  7
  •   Daniel Hilgarth Richard    7 年前

    您可以通过另外创建一个非泛型类来实现这一点 ResultsPair 使用通用方法 Create CreateSuccess CreateError :

    public static class ResultsPair
    {
        public static ResultsPair<T> CreateSuccess<T>(T value) => Create(ResultsItem.Success(string.Empty), value);
        public static ResultsPair<T> CreateError<T>(ResultsItem result) => Create(result, default(T));
    
        public static ResultsPair<T> Create<T>(ResultsItem result, T value)
        {
            return new ResultsPair<T>(result, value);
        }
    }
    

    ResultsPair.CreateSuccess(newUser);
    ResultsPair.CreateError<User>(ResultsItem.Error("A server connection error has occured."));
    ResultsPair.Create(ResultsItem, User)
    

    只是澄清一下:您的完整代码如下所示:

    public class ResultsPair<T>
    {
        public T Value { get; set; }
        public ResultsItem Result { get; set; }
    
        public ResultsPair(ResultsItem result, T value)
        {
            Result = result;
            Value = value;
        }
    }
    
    public static class ResultsPair
    {
        public static ResultsPair<T> CreateSuccess<T>(T value) => Create(ResultsItem.Success(string.Empty), value);
        public static ResultsPair<T> CreateError<T>(ResultsItem result) => Create(result, default(T));
    
        public static ResultsPair<T> Create<T>(ResultsItem result, T value)
        {
            return new ResultsPair<T>(result, value);
        }
    }