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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法聲明以任何 lambda 作為參數(shù)的方法?

有沒有辦法聲明以任何 lambda 作為參數(shù)的方法?

C#
猛跑小豬 2023-09-24 10:36:08
我正在嘗試用 C# 編寫一個接受任何類型的 lambda 的方法,但我不知道該怎么做。我正在開發(fā)一個處理文本命令的類。我想以這樣的方式實現(xiàn)它,即參數(shù)將根據(jù)處理特定命令的 lambda 表達式自動確定。以下是我想要獲取的 API 的示例:commandProcessor.AddCommand("setpos", (int x, int y)=>{    //do stuff});commandProcessor.AddCommand("changename",(string newName)=>{    //do completely different stuff});我的命令處理器將如下所示:Dictionary<string, MagicType> mCommands;public void AddCommand(string commandName, MagicType commandHandler){    mCommands[commandName] = commandHandler;}是否有我可以使用的 MagicType 或者我應(yīng)該使用完全不同的方法?
查看完整描述

2 回答

?
一只名叫tom的貓

TA貢獻1906條經(jīng)驗 獲得超3個贊

如果你確實需要這種功能,你可以這樣做。


public delegate object GenericCommand (params object[] parameters);

然后,您需要為您想要存儲的每個符合 GenericCommand 定義的方法提供重載。


下面是一個示例。


using System;

using System.Collections.Generic;


public class Program

{

    public delegate object GenericCommand (params object[] parameters);


    public static object Function1 (params object[] parameters) => Function1 ((int)parameters[0], (int)parameters[1]);

    public static int Function1 (int i, int j) => (i + j);


    private static Dictionary<string, GenericCommand> commands;


    public static void Main()

    {

        commands = new Dictionary<string, GenericCommand> ();


        commands.Add ("Function1", Function1);


        int i = (int)commands["Function1"](1, 2);


        Console.WriteLine (i); // 3

    }   

}

綜上所述,在 C# 這樣的語言中執(zhí)行此操作有點棘手,這是有原因的。在強類型語言中,期望是當(dāng)調(diào)用方法時,用戶心中有一組特定的輸入,并期望得到特定類型的輸出。通常不需要像這樣不倫不類的東西,GenericCommand因為如果您知道方法的名稱以及它通常所在的位置,為什么不直接調(diào)用它呢?


如果您發(fā)現(xiàn)自己的程序中經(jīng)常需要這種功能,那么我會考慮用另一種語言編寫基線的這一部分。我對此的了解有限,但我相信F#可以輕松完成您所要求的任務(wù)。Javascript 是另一種選擇,但 F# 是作為 C# 的姊妹函數(shù)語言編寫的,因此它可能更容易集成到您的項目中。函數(shù)式語言(據(jù)我所知)更關(guān)心您所編寫內(nèi)容的純粹功能,而不是操作數(shù)的性質(zhì),盡管我不太確定它對參數(shù)的數(shù)量是否不可知。這當(dāng)然值得研究。


查看完整回答
反對 回復(fù) 2023-09-24
?
HUWWW

TA貢獻1874條經(jīng)驗 獲得超12個贊

除了編譯為Expressions 時之外,lambda 都會編譯為 的實例System.Delegate。但這是一種非常模糊的類型,您必須使用反射來發(fā)現(xiàn)任何東西。

Action您可以通過聲明一組接受、Action<T>、等的重載來做得更好。Action<T1, T2>這些是返回 的函數(shù)的 BCL 內(nèi)置委托類型void。


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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