来自参数的通用T而不是手动指定

Fer*_*X32 3 c# generics

我写了这堂课:

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));
}
Run Code Online (Sandbox Code Playgroud)

要打电话给我,我会这样做:

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

在第一个,newUser是User类型,所以我不想使用<User>再次手动定义它.

在CreateError上,我没有问题手动定义T类,因为默认情况下它不会知道它.

在Create方法上,我需要这样做ResultsPair<User>.Create(ResultsItem, User).我不喜欢哪个.ResultsPair.Create(ResultsItem, User)应该够了.

有没有办法让它实现我想要的?

谢谢

Dan*_*rth 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)