C#:定义一个接受N个布尔参数的委托,以便以后提取参数名

C#:定义一个接受N个布尔参数的委托,以便以后提取参数名,c#,delegates,metaprogramming,C#,Delegates,Metaprogramming,我正在进行一个个人项目,以构建一个真值表生成器,重点是收集/巩固我正在学习的关于逻辑等价性的知识 因此,我试图以这样一种方式来编写它,即以C#函数作为参数。稍后我将把它转换成一个,但现在我想学习更多关于委托、元编程的知识,并在学习过程中享受逻辑等价的乐趣 所以,我想弄清楚的是,在语法上我将如何定义一个接受1到N个布尔参数的委托,这样我就可以避免像这样违反DRY public delegate bool OneArgFunc(bool arg1); public delegate bool Tw

我正在进行一个个人项目,以构建一个真值表生成器,重点是收集/巩固我正在学习的关于逻辑等价性的知识

因此,我试图以这样一种方式来编写它,即以C#函数作为参数。稍后我将把它转换成一个,但现在我想学习更多关于委托、元编程的知识,并在学习过程中享受逻辑等价的乐趣

所以,我想弄清楚的是,在语法上我将如何定义一个接受1到N个布尔参数的委托,这样我就可以避免像这样违反DRY

public delegate bool OneArgFunc(bool arg1);

public delegate bool TwoArgFunc(bool arg1, bool arg2);

public delegate bool ThreeArgFunc(bool arg1, bool arg2, bool arg3);

public delegate bool OuchieThisIsStartingToHurt(bool arg, bool arg, bool arg...);
…我不相信下面的内容可以做到这一点,因为“ListOnlyFunc”将布尔类型的列表作为一个参数——当我想要的是一个委托,它可以接受一个具有两个布尔参数的布尔函数,或者一个具有1200个布尔参数的函数时

public delegate bool ListOnlyFunc(bool[] args); // Nope!
我希望避免后者的部分原因是我希望能够从函数中提取参数名称(而不是显示通用索引参数)。例如,如果我运行下面的命令,我会在输出窗口中看到“foo,baz,turkey”;我不想简单地获得参数数量的计数并输出一个索引(“1,2,3”)

如果您对我如何处理这个问题有任何建议(或者如果可能的话),我们将不胜感激

谢谢


Chris

您可以这样定义param方法委托

 public delegate bool SumParameters(params bool[] values)
若你们想知道参数的名称,那个么你们可以使用字典,这个解决方案已经由@Rob建议过了

 public delegate bool SumParameters(Dictionary<string,bool> values)
public委托bool参数(字典值)

因为需要参数名,所以会有点混乱。根据您想做的事情,您可以这样写:

public void MyFunc(bool? argOne = null, 
              bool? argTwo = null,
              bool? argThree = null,
              bool? argFour = null,
              bool? argFive = null)
{

}
MyFunc(true);
MyFunc(true, false);
MyFunc(true, false, true);
MyFunc(true, false, true, false);
public void MyFunc(Dictionary<string, bool> args)
{

}
 MyFunc(new Dictionary<string, bool> { { "arg1", true }, {"arg2", true } });
void Main()
{
    Console.WriteLine(MethodSignature((Func<bool, bool, bool>)testFunc));
    Console.WriteLine(MethodSignature((Action<bool, bool[]>)testAction));
}

bool testFunc(bool a, bool b) => a || b;

void testAction(bool a, bool[] b) { };
你可以这样称呼它:

public void MyFunc(bool? argOne = null, 
              bool? argTwo = null,
              bool? argThree = null,
              bool? argFour = null,
              bool? argFive = null)
{

}
MyFunc(true);
MyFunc(true, false);
MyFunc(true, false, true);
MyFunc(true, false, true, false);
public void MyFunc(Dictionary<string, bool> args)
{

}
 MyFunc(new Dictionary<string, bool> { { "arg1", true }, {"arg2", true } });
void Main()
{
    Console.WriteLine(MethodSignature((Func<bool, bool, bool>)testFunc));
    Console.WriteLine(MethodSignature((Action<bool, bool[]>)testAction));
}

bool testFunc(bool a, bool b) => a || b;

void testAction(bool a, bool[] b) { };
然而,这带来了一些复杂情况。例如,这是否有效

MyFunc(null, true)
这里我们只提供了
argTwo
,但是您必须同时提供前面的所有参数(即,跳过一个参数是无效的)

或者,您可以执行以下操作:

public void MyFunc(bool? argOne = null, 
              bool? argTwo = null,
              bool? argThree = null,
              bool? argFour = null,
              bool? argFive = null)
{

}
MyFunc(true);
MyFunc(true, false);
MyFunc(true, false, true);
MyFunc(true, false, true, false);
public void MyFunc(Dictionary<string, bool> args)
{

}
 MyFunc(new Dictionary<string, bool> { { "arg1", true }, {"arg2", true } });
void Main()
{
    Console.WriteLine(MethodSignature((Func<bool, bool, bool>)testFunc));
    Console.WriteLine(MethodSignature((Action<bool, bool[]>)testAction));
}

bool testFunc(bool a, bool b) => a || b;

void testAction(bool a, bool[] b) { };
public void MyFunc(字典参数)
{
}
这样称呼它:

public void MyFunc(bool? argOne = null, 
              bool? argTwo = null,
              bool? argThree = null,
              bool? argFour = null,
              bool? argFive = null)
{

}
MyFunc(true);
MyFunc(true, false);
MyFunc(true, false, true);
MyFunc(true, false, true, false);
public void MyFunc(Dictionary<string, bool> args)
{

}
 MyFunc(new Dictionary<string, bool> { { "arg1", true }, {"arg2", true } });
void Main()
{
    Console.WriteLine(MethodSignature((Func<bool, bool, bool>)testFunc));
    Console.WriteLine(MethodSignature((Action<bool, bool[]>)testAction));
}

bool testFunc(bool a, bool b) => a || b;

void testAction(bool a, bool[] b) { };
MyFunc(新字典{{“arg1”,true},{“arg2”,true});

如果您只想获取有关该方法的一些信息,那么您需要的是一个接受
委托作为参数的方法:

public static string MethodSignature(Delegate del) => del.Method.ToString();
这样做的缺点是,方法不是
委托
(或
委托
),因此在调用时必须强制转换为
Func
操作
或其他合适的委托类型,如下所示:

public void MyFunc(bool? argOne = null, 
              bool? argTwo = null,
              bool? argThree = null,
              bool? argFour = null,
              bool? argFive = null)
{

}
MyFunc(true);
MyFunc(true, false);
MyFunc(true, false, true);
MyFunc(true, false, true, false);
public void MyFunc(Dictionary<string, bool> args)
{

}
 MyFunc(new Dictionary<string, bool> { { "arg1", true }, {"arg2", true } });
void Main()
{
    Console.WriteLine(MethodSignature((Func<bool, bool, bool>)testFunc));
    Console.WriteLine(MethodSignature((Action<bool, bool[]>)testAction));
}

bool testFunc(bool a, bool b) => a || b;

void testAction(bool a, bool[] b) { };

考虑使用<代码>方法信息< />代码>,它允许获取参数名,也可以调用函数,如果您提供一个数组,其元素的数量与预期的参数数量匹配。在我看来,您提供的代码(<代码> MyFunc )与您所提供的委托列表逻辑上不匹配。我认为您需要进一步充实您的代码,并展示它与委托的关系。这仍然存在一个问题,即他需要参数名(
我不想简单地获取参数数量并输出索引(“1,2,3”)。