c# - 将方法转换为泛型和非泛型类

标签 c# generics

我想具体一点。我有一个名为 Result 的类和一个名为 Result 的派生类

public class Result
{
    public string Message { get; set; }

    public bool Success { get; set; }
}

public class Result<T> : Result
{
    public T Data { get; set; }
}

这些类用作方法中的返回类型。为此,我创建了这个辅助类:

public class ResultManager
{
    /// <summary>
    /// Returns a success action
    /// </summary>
    public static Result Success()
    {
        var result = new Result { Success = true };

        return result;
    }

    /// <summary>
    /// Returns a success action
    /// </summary>
    /// <typeparam name="T">The object type to return with the result</typeparam>
    public static Result<T> Success<T>(T data)
    {
        var result = new Result<T> { Success = true, Data = data };

        return result;
    }

    /// <summary>
    /// Returns a failed result
    /// </summary>
    public static Result Failed(string errorMessage = null, Exception exception = null)
    {
        // ... unrelevant code for the question

        return new Result { Success = false, Message = errorMessage };
    }
}

正如您所看到的,上面的代码有两种成功的返回类型,一种是您不想返回任何内容,另一种是您想返回某些内容,但 Failed 结果永远不会返回任何内容。这是不必要的,只是一条错误消息。 这让我想到以下问题:当我想要创建一个可以返回带有返回类型的 Success 的方法,并且在没有返回类型的情况下失败时,如何转换它来确定返回类型是 Success(generic) 还是 Failed ? 就像这里的这个方法:

// The return type of the method is Result, because Result<T> derives from it
public static Result GetClipboardFromDateTime(DateTime dateTime)
{
    // Search for items
    IEnumerable<ClipboardCopy> items = null;
    try
    {
        items = mClipboardCollection.Where(a => a.CopiedTime == dateTime);
    }
    catch (Exception ex)
    {
        // This will return the class "Result"
        return ResultManager.Failed(
            "Something went wrong getting copies from the clipboard.", ex);
    }

    // If there is not values
    if (items.Count() <= 0)
        return ResultManager.Failed("There are not copies with that datetime.");

    // Return values
    // This will return the class Result<T>
    return ResultManager.Success(items.ToArray());
}

实际上,我正在这样做:

var clipboard2 = (Result<ClipboardCopy[]>)AClipboard.GetClipboardFromDateTime(DateTime.Today);

如果返回类型是 Result(generic),那么这将起作用,但如果它是 Return,则会崩溃并出现异常:

System.InvalidCastException:“无法将对象从类型“AdvancedClipboard.Desktop.Models.Result”转换为类型“AdvancedClipboard.Desktop.Models.Result`1[AdvancedClipboard.Desktop.Models.ClipboardCopy[]]”。”

最佳答案

您尝试预先转换时出现问题。方法返回两种类型的结果。

  1. 成功
  2. 失败

我认为你应该做这样的事情。

var result = AClipboard.GetClipboardFromDateTime(DateTime.Today);

if(Result.Success)
{
   var dataResult = (Result<ClipboardCopy[]>) result;
}

如果你不想进行选角。还有另一种方法,但我不建议。

var result = AClipboard.GetClipboardFromDateTime(DateTime.Today);

if(result.Success)
{
    dynamic d = result.Data;
}

在上面的动态示例中,您不需要进行转换,但同时您会失去对数据的强类型访问。主要建议在进行互操作工作时使用。如果您同意失去强类型访问权限,那么您可以使用它。另一件事是与此相关的任何错误都将在运行时执行。

关于c# - 将方法转换为泛型和非泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51156570/

相关文章:

c# - Bitshifting Int16 仅适用于文字

java - map 中的动态模板依赖

f# - F# 中的泛型和接口(interface)

Java 泛型 - 无法使用扩展泛型覆盖方法

java - Arrays.asList : when a set is used as the argument we get back a list<set<Integer>> instead of List<Integer>

c# - ListView ColumnHeader.Name 为空字符串

c# - 处理不受信任的证书

c# - 如何使用私有(private)方法调整 C# 类?

java - Spring-Data Repository @Query by class with generic class

c# - 无法使用 DataStax C# 驱动程序从 Cassandra 获取值