我想具体一点。我有一个名为 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[]]”。”
最佳答案
您尝试预先转换时出现问题。方法返回两种类型的结果。
- 成功
- 失败
我认为你应该做这样的事情。
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/