【发布时间】:2018-07-03 14:01:59
【问题描述】:
我想具体一点。我有一个名为 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 };
}
}
如你所见,上面的代码有两种返回成功的类型,一种是你不想返回任何东西,另一种是你想返回一些东西,但失败的结果永远不会返回一些东西。这是不必要的,只是一个错误消息。 这给我带来了以下几点:当我想创建一个可以返回 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[]]'。
【问题讨论】:
-
崩溃时的错误信息是什么?
-
System.InvalidCastException: '无法将对象从类型 'AdvancedClipboard.Desktop.Models.Result' 转换为类型 'AdvancedClipboard.Desktop.Models.Result`1[AdvancedClipboard.Desktop.Models.ClipboardCopy[ ]]'。'
-
基类
Result的意义何在?如您所见,首先要做的就是将其转换为其他东西。当您将基类的实例转换为派生类的实例时,您会期待什么,而实际上它不是派生类? C# 设计者决定抛出一个异常(你已经向我们展示了),认为这是一个程序员错误。 -
@ZdeněkJelínek 是的,但第二个结果:“没有那个日期时间的副本。”不是编程错误。
-
为什么不总是返回一个
Result<ClipboardCopy[]>?在某些情况下,您可能没有任何数据,但这不应该给您带来问题......