Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将结构用作使用不同参数的方法的单个方法参数_C# - Fatal编程技术网

C# 将结构用作使用不同参数的方法的单个方法参数

C# 将结构用作使用不同参数的方法的单个方法参数,c#,C#,我有一个包含枚举(键)和方法(值)的字典。所有的方法都有不同的作用;其中有些使用参数,有些不使用。为了将所有方法存储在一个字典中,我决定使用struct作为每个方法的唯一参数。这些方法将使用的参数都是不同的(即,有些可能需要一个范围(int-min、int-max)或一个字符串(字符串格式))。最干净的方法是什么?现在我可以随意使用每种类型的两个参数,让方法调用方和方法来协调正确的用法。这是一种丑陋的做事方式,如果丑陋,通常会有更干净的方式。从做过类似事情的人那里寻找一些意见 Dictionar

我有一个包含枚举(键)和方法(值)的字典。所有的方法都有不同的作用;其中有些使用参数,有些不使用。为了将所有方法存储在一个字典中,我决定使用struct作为每个方法的唯一参数。这些方法将使用的参数都是不同的(即,有些可能需要一个范围(int-min、int-max)或一个字符串(字符串格式))。最干净的方法是什么?现在我可以随意使用每种类型的两个参数,让方法调用方和方法来协调正确的用法。这是一种丑陋的做事方式,如果丑陋,通常会有更干净的方式。从做过类似事情的人那里寻找一些意见

Dictionary<Enums.MethodTypes, Func<MethodArguments, string>> 
     methodDictionary = new Dictionary<Enums.MethodTypes, Func<MethodArguments, string>

public struct MethodArguments
{
    int intArg_1;
    int intArg2_2;

    string strArg_1;
    string strArg_2;

    double dblArg_1;
    double dblArg_2;

    public MethodArguments(int a1, int a2, string s1, string s2, double d1, double d2)
    {
        intArg_1 = a1;
        intArg_2 = a2;
        strArg_1 = s1;
        strArg_2 = s2;
        dblArg_1 = d1;
        dblArg_2 = d2;
    }
}
字典

methodDictionary=new Dictionary如果您从用户界面获取参数,您可能会从一个
字符串[]
开始。然后需要决定将参数转换为何种类型以及将其放置在何处(
intArg_1
strArg_1
)。由于这些方法本身不公开这些信息,所以您也需要将这些信息存储在某个地方

如果您允许进行一些反思(如果这一输入直接来自用户,则性能影响不会明显),那么您的字典中可能会有更简单的代码存储
MethodInfo
s。您仍然需要将参数转换为正确的类型,但反射同样允许您获取所需的参数计数及其类型


作为奖励,目标方法可以是普通的旧C#方法,而不是要求它们接受
struct

不使用mutable
struct
s。SLaks公平地说,没有任何东西会对其进行变异或允许其进行外部变异。为什么要将每个Func存储在字典中?最初的问题是什么?如果您的参数不一致,您不应该这样做。您建议的
struct
非常糟糕。对于每个方法签名,您将向
结构
添加更多字段,使其大小增长到荒谬的程度。即使您更改它以有效地合并不同的签名(即使用
[FieldOffset]
),它仍然是维护的噩梦。有关更好的选项,请参见标记的副本。短版本:使用基本类型
委托
作为值。在调用站点,您要么在编译时知道签名,要么不知道签名;如果是这样,只需将编译时强制转换包含到正确的委托类型即可。如果不是,则将参数放入数组中并调用
DynamicInvoke()