我是 C# 新手,有一个问题。我不确定这个问题或类似的问题以前是否被问过,但是我找不到明确的解决方案。我在 C# 中创建了一个方法,它的参数是一个泛型方法:
public void MyMethod (some_generic_method)
“some_generic_method”可能具有不同数量的同质数据类型的参数。我该如何创建“MyMethod”的签名?
编辑:我会尽力尽可能清楚地解释为什么需要所要求的解决方案。我正在用 C# 制作一个测试库,该库包含一个类似于“MyMethod”的方法。
想象一下:
- 用户创建了一个具有多种不同方法的类,
- 用户正在他/她的 C# 脚本中“使用”我的库,
- 用户事先知道为了能够利用该库,他/她的方法名称必须包含特定字符串(假设为“test”),
- 我的库“MyMethod”应该找到那些名称中包含“test”的用户定义方法(在我的代码的相应部分中,我使用反射、汇编、类型……和“if (method.name 包含“test”)”,以便库可以检测这些特定方法并将它们单独传递给其“MyMethod”),
- 现在,由于我们不知道这些用户定义的方法签名是什么样的,因此“MyMethod”的参数应该能够处理任何用户定义的方法。这就是为什么在我的问题中,我首先提到“some_generic_method”(即“MyMethod”参数)可能具有不同数量的具有同质/异构数据类型的参数。
我希望这个解释能让问题更清楚。
谢谢。
最佳答案
考虑
据我所知,在不知道其签名的情况下不可能调用方法。
在 C# 中,与 Javascript、Python 或 Ruby 不同,签名是静态的,在编译后明确定义,因此不可变。
即使使用对象上的反射作为参数,您也会遇到相同的问题来管理具有未知类型的未知参数的未知方法的参数。
C# 是一种强类型语言,一种编译语言,甚至使用动态。
C# 泛型并不意味着未知的类型和签名,相反,它们不是 C++ 模板,即使它们是祖先。
使用params
作为参数
https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/params
public delegate void ParameterizedActionWithParams(params object[] parameters);
public void MyAction(ParameterizedActionWithParams action, params object[] parameters)
{
if ( action != null )
action(parameters);
else
ManageArgumentNullException();
}
使用对象列表
public delegate void ParameterizedActionWithList(List<object> parameters);
public void MyAction(ParameterizedActionWithList action, List<object> parameters)
{
if ( action != null )
action(parameters);
else
ManageArgumentNullException();
}
限制
不能有强类型参数。
如果您也需要函数,那么如果返回的参数可能有所不同,并且您只能这样做,则会出现问题:
public delegate object ParameterizedFuncWithParams(params object[] parameters);
public delegate object ParameterizedFuncWithList(List<object> parameters);
因此您需要创建这些变体:
public object MyFunc(ParameterizedFuncWithParams func, params object[] parameters)
{
if ( func != null )
return func(parameters);
else
ManageArgumentNullException();
}
public object MyFunc(ParameterizedFuncWithList func, List<object> parameters)
{
if ( func != null )
return func(parameters);
else
ManageArgumentNullException();
}
关于c# - 如何在 C# 中创建一个以方法作为参数且参数数量不确定的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58770304/