第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

C# 方法,無(wú)論輸入/返回類(lèi)型如何,都采用另一個(gè)方法作為參數(shù)

C# 方法,無(wú)論輸入/返回類(lèi)型如何,都采用另一個(gè)方法作為參數(shù)

C#
滄海一幻覺(jué) 2023-09-16 20:14:11
如果標(biāo)題不清楚,我很抱歉。基本上,我想通過(guò)將大量重復(fù)的錯(cuò)誤處理移到一個(gè)地方來(lái)干燥我的代碼。我正在調(diào)用幾種方法,它們都會(huì)拋出類(lèi)似的錯(cuò)誤。每個(gè)都采用不同的參數(shù),并返回不同的類(lèi)型。我希望能夠做這樣的事情:public class MyClass {    public static ErrorWrapper<Void> Method1(string s1, string s2) {        return Wrapper<Void>(System.Method1, s1, s2);    }    public static ErrorWrapper<string> Method2(string s) {        return Wrapper<string>(System.Method2, s);    }    public static ErrorWrapper<MyOtherClass> Method3(string s, int i) {        return Wrapper<MyOtherClass>(System.Method3, s, i)    }    private static ErrorWrapper<T> Wrapper<T>(Func f, /*parameters?*/) {        try {            return f(parameters);        } catch {            // Handle exceptions        }}我需要這樣做,因?yàn)槲艺跒橐环N沒(méi)有異常處理的語(yǔ)言編寫(xiě)綁定,因此使用錯(cuò)誤包裝類(lèi)是安全調(diào)用標(biāo)準(zhǔn)庫(kù)方法的唯一方法。
查看完整描述

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


查看完整回答
反對(duì) 回復(fù) 2023-09-16
?
收到一只叮咚

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

        }

    }

}



查看完整回答
反對(duì) 回復(fù) 2023-09-16
  • 2 回答
  • 0 關(guān)注
  • 134 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)