2 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
除非我在這里遺漏了一些東西 -
private static ErrorWrapper<T> Wrapper<T>(Func<T> f)
{
// implementation
}
用法:
return Wrapper<string>(() => System.Method2(s));
return Wrapper<MyOtherClass>(() => System.Method3(s, I));

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是我根據(jù)我對(duì)您正在嘗試的事情的理解提出的建議。不幸的是,您必須使用速度DynamicInvoke較慢的 ,以便在調(diào)用常規(guī) 時(shí)在運(yùn)行時(shí)檢查類(lèi)型Delegate。您不能用作void泛型的類(lèi)型參數(shù),因此我創(chuàng)建了一個(gè)MyVoid專(zhuān)門(mén)處理的類(lèi)。
我更新了我的答案以反映System.Methods 是實(shí)際方法,而不是靜態(tài)字段,因此它們?cè)趥鬟f給時(shí)必須進(jìn)行強(qiáng)制轉(zhuǎn)換Wrapper<>- C# 無(wú)法將方法轉(zhuǎn)換為通用Delegate.
我還添加了一個(gè)類(lèi)型安全版本,但這需要?jiǎng)?chuàng)建大量樣板方法來(lái)處理參數(shù)數(shù)量,但它確實(shí)消除了大量轉(zhuǎn)換,并且可以靜態(tài)調(diào)用委托,這應(yīng)該更高效。
我Method3最初不小心采用了兩個(gè)字符串參數(shù),并且非類(lèi)型安全版本直到在運(yùn)行時(shí)調(diào)用才出現(xiàn)錯(cuò)誤。類(lèi)型安全版本在編譯時(shí)捕獲了錯(cuò)誤。
public class MyVoid { }
public class ErrorWrapper<T> {
public T Result;
public bool ValidResult;
public Exception Exception;
public ErrorWrapper(T res) {
ValidResult = true;
Result = res;
}
public ErrorWrapper(Exception e) {
Exception = e;
ValidResult = false;
}
public ErrorWrapper() { // void
ValidResult = true;
}
}
public class MyClass {
public static ErrorWrapper<MyVoid> Method1(string s1, string s2) => Wrapper<MyVoid>((Action<string, string>)System.Method1, s1, s2);
public static ErrorWrapper<string> Method2(string s) => Wrapper<string>((Func<string, string>)System.Method2, s);
public static ErrorWrapper<MyOtherClass> Method3(string s, int i) => Wrapper<MyOtherClass>((Func<string, int, MyOtherClass>)System.Method3, s, i);
private static ErrorWrapper<T> Wrapper<T>(Delegate f, params object[] p) {
try {
switch (default(T)) {
case MyVoid _:
f.DynamicInvoke(p);
return new ErrorWrapper<T>();
default:
return new ErrorWrapper<T>((T)f.DynamicInvoke(p));
}
}
catch (Exception e) {
// Handle exceptions
return new ErrorWrapper<T>(e);
}
}
}
public static class ErrorWrapper {
public static ErrorWrapper<T> New<T>(T res) => new ErrorWrapper<T>(res);
}
public class MyTypeSafeClass {
public static ErrorWrapper<MyVoid> Method1(string s1, string s2) => WrapperAction(System.Method1, s1, s2);
public static ErrorWrapper<string> Method2(string s) => WrapperFunc(System.Method2, s);
public static ErrorWrapper<MyOtherClass> Method3(string s, int i) => WrapperFunc(System.Method3, s, i);
private static ErrorWrapper<MyVoid> WrapperAction<T1, T2>(Action<T1, T2> f, T1 p1, T2 p2) {
try {
f(p1, p2);
return ErrorWrapper.New(default(MyVoid));
}
catch (Exception e) {
// Handle exceptions
return new ErrorWrapper<MyVoid>(e);
}
}
private static ErrorWrapper<TRes> WrapperFunc<T1, TRes>(Func<T1, TRes> f, T1 p1) {
try {
return ErrorWrapper.New(f(p1));
}
catch (Exception e) {
// Handle exceptions
return new ErrorWrapper<TRes>(e);
}
}
private static ErrorWrapper<TRes> WrapperFunc<T1, T2, TRes>(Func<T1, T2, TRes> f, T1 p1, T2 p2) {
try {
return ErrorWrapper.New(f(p1, p2));
}
catch (Exception e) {
// Handle exceptions
return new ErrorWrapper<TRes>(e);
}
}
}
- 2 回答
- 0 關(guān)注
- 134 瀏覽
添加回答
舉報(bào)