1. 程式人生 > 其它 >c# 函數語言程式設計,設計所有函式均有返回值,形成函式鏈

c# 函數語言程式設計,設計所有函式均有返回值,形成函式鏈

 

1. 函式返回值基類

public class FuncResult
{
public FuncResult()
{
Success = true;
}

public FuncResult(string errMsg)
{
Success = false;
ErrorMessage = errMsg;
}

public FuncResult(bool success)
{
Success = success;
}

public bool Success { get; set; }

private string error;
public string ErrorMessage
{
get { return error; }
set
{
error = value;
Success = string.IsNullOrEmpty(error);
}
}

[JsonIgnore]
private Exception exception;

[JsonIgnore]
public Exception Exception
{
get { return exception; }
set
{
exception = value;

if (string.IsNullOrEmpty(ErrorMessage))
{
if (exception != null)
{
ErrorMessage = exception.Message;
}
}
else
{
if (exception != null)
{
ErrorMessage = ErrorMessage + ";" + exception.Message;
}
}

ErrorMessage = exception == null ? String.Empty : exception.Message;
}
}

public void SetError(string err)
{
if (string.IsNullOrEmpty(ErrorMessage))
{
ErrorMessage = err;
}
else if (!string.IsNullOrEmpty(err))
{
ErrorMessage = ErrorMessage + ";" + err;
}
}

public void SetError(Exception e)
{
Exception = e;
}

public void SetError(FuncResult result)
{
if (result.Exception != null)
{
Exception = result.Exception;
}

if (!string.IsNullOrEmpty(result.ErrorMessage))
{
if (string.IsNullOrEmpty(ErrorMessage))
{
ErrorMessage = result.ErrorMessage;
}
else if (!string.IsNullOrEmpty(result.ErrorMessage))
{
ErrorMessage = ErrorMessage + ";" + result.ErrorMessage;
}
}
}

public void FillError(FuncResult result)
{
if (Exception != null)
{
result.Exception = Exception;
}

if (string.IsNullOrEmpty(result.ErrorMessage))
{
result.ErrorMessage = ErrorMessage;
}
else if (!string.IsNullOrEmpty(ErrorMessage))
{
result.ErrorMessage = result.ErrorMessage + ";" + ErrorMessage;
}
}

public T Next<T>(Action<T> successAction = null, FuncResult result = null, Action<T> failAction = null)
where T : FuncResult
{
var t = this as T;

TryCatch(
() =>
{
if (t != null)
{
if (t.Success)
{
if (successAction != null)
{
successAction(t);
}
}
else if (failAction != null)
{
failAction(t);
}

if (result != null)
{
t.FillError(result);
}
}
else if (result != null)
{
result.SetError("Next 函式引數型別無效!");
}
},
(ex) =>
{
if (result != null)
{
result.SetError(ex);
}
});

return t;
}

public static void TryCatch(Action tryAction, Action<Exception> catchAction = null, Action finallyAction = null)
{
try
{
if (tryAction != null)
{
tryAction();
}
}
catch (Exception ex)
{
if (catchAction != null)
{
catchAction(ex);
}
}
finally
{
if (finallyAction != null)
{
finallyAction();
}
}
}

public static TResult Execute<TResult>(Action<TResult> action) where TResult : FuncResult, new()
{
TResult result = new TResult();

try
{
action(result);
}
catch (Exception ex)
{
result.SetError(ex);
}

return result;
}

public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}

2.函式返回值泛型

public class FuncResult<TData> : FuncResult
{
public TData Data { get; set; }
public virtual void SetData(TData data)
{
Data = data;
}
}

public class FuncResult<TData1, TData2> : FuncResult
{
public TData1 Data1 { get; set; }
public TData2 Data2 { get; set; }

public virtual void SetData(TData1 data1, TData2 data2)
{
Data1 = data1;
Data2 = data2;
}
}

public class FuncResult<TData1, TData2, TData3> : FuncResult<TData1, TData2>
{
public TData3 Data3 { get; set; }

public virtual void SetData(TData1 data1, TData2 data2, TData3 data3)
{
base.SetData(data1, data2);
Data3 = data3;
}
}

public class FuncResult<TData1, TData2, TData3, TData4> : FuncResult<TData1, TData2, TData3>
{
public TData4 Data4 { get; set; }

public virtual void SetData(TData1 data1, TData2 data2, TData3 data3, TData4 data4)
{
base.SetData(data1, data2, data3);
Data4 = data4;
}
}

public class FuncResult<TData1, TData2, TData3, TData4, TData5> : FuncResult<TData1, TData2, TData3, TData4>
{
public TData5 Data5 { get; set; }

public virtual void SetData(TData1 data1, TData2 data2, TData3 data3, TData4 data4, TData5 data5)
{
base.SetData(data1, data2, data3, data4);
Data5 = data5;
}
}

public class FuncResult<TData1, TData2, TData3, TData4, TData5, TData6> : FuncResult<TData1, TData2, TData3, TData4, TData5>
{
public TData6 Data6 { get; set; }

public virtual void SetData(TData1 data1, TData2 data2, TData3 data3, TData4 data4, TData5 data5, TData6 data6)
{
base.SetData(data1, data2, data3, data4, data5);
Data6 = data6;
}
}

3.示例

如果函式沒有返回值,可以將函式返回值定義為FuncResult,返回結果表示函式執行過程中是否異常報錯

public void Print(string name)
{
  Console.WriteLine(name);
}

public FuncResult Print2(string name)
{
  return FuncResult.Execute<FuncResult>(result =>
  {
    Console.WriteLine(name);
  });
}

public FuncResult Print3(string name)
{
  return Print2(name).Next<FuncResult>(successResult =>
  {
    //成功時操作
  },
  failAction: failResult =>
  {
    //失敗時操作
  });
}