当前位置: 首页 > 知识库问答 >
问题:

将方法转换为泛型类和非泛型类

蒲昀
2023-03-14

我想说得具体一点。我有一个名为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; }
}

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

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

正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返回类型返回failed的方法时,我如何转换它来确定返回类型是Success(泛型)还是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个答案

慕容灿
2023-03-14

有一个问题是,您正在尝试预先转换。方法返回两种类型的结果。

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

上面的示例动态,您不需要进行强制转换,但同时您放松了对数据的强类型访问。主要是在你做互操作工作的时候建议。如果您可以取消强类型访问,那么您可以使用它。还有一点,任何与此相关的错误都将在运行时执行。

 类似资料:
  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 我有一个类似于Pairs的类。我有一个特性,可以将这个类转换成Json格式。 当我使用这个特性时,我得到了以下错误,即对于

  • 我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。

  • 我正在创建一个由数组支持的泛型类型堆栈。当我尝试创建泛型类型数组时,Java不允许我这样做。有人告诉我,我必须创建一个类型为Object的数组,并将其转换为泛型类型。我已经将对象数组转换为类型,但如何处理Java不断给我的未检查类型错误? 这就是我目前所处的位置。 更新:我正在创建一个对象数组,然后在方法的末尾将返回类型转换为T类型。