C# 从IronPython调用带有变量参数的CLR方法

C# 从IronPython调用带有变量参数的CLR方法,c#,ironpython,C#,Ironpython,我使用Iron Python作为一个“免费”的工具来测试一个API,该API将wrapps通信到一些定制硬件,以便非开发团队可以通过Python使用硬件 但是,我无法确定如何使.NETvoid func(params object[]args)映射到Pythondef(*args) 下面是一些代码来解释 我有一种类型,允许注入日志回调来格式化和处理消息,它的签名是Console.WriteLine和Debug.WriteLine public class Engine { Action&

我使用Iron Python作为一个“免费”的工具来测试一个API,该API将wrapps通信到一些定制硬件,以便非开发团队可以通过Python使用硬件

但是,我无法确定如何使.NET
void func(params object[]args)
映射到Python
def(*args)

下面是一些代码来解释

我有一种类型,允许注入日志回调来格式化和处理消息,它的签名是Console.WriteLine和Debug.WriteLine

public class Engine
{
    Action<string, object[]> _logger;
    public void Run()
    {
        Log("Hello '{0}'", "world");
    }
    public void SetLog(Action<string, object[]> logger)
    {
        _logger = logger;
    }
    void Log(string msg, params object[] args)
    {
        _logger(msg, args);
    }
}
输出

Hello '('world',)'
Hello 'IronPython.Runtime.List'
Hello 'IronPython.Runtime.List'
Hello 'IronPython.Runtime.List'
我想要

Hello 'world'
因为将iron python对象(第一种输出情况下为元组,最后三种情况下为列表)作为单个对象处理,并且不知道您希望python集合用作
params object[]
您将获得意外的输出。调用
def logger
时,隐式创建单个python对象/元组

根据您的实际用例/风格,您可以用不同的方式解决这个问题

最具python-y风格的方式是在调用站点扩展参数,如Jeff在回答中所解释的:

def logger(msg, *args):
    print( String.Format(msg, *args) )
如果仅从CLR调用
logger
作为
Action
的实现,则可以将
args
作为
object[]类型的单个(非变量)参数

def logger(msg, args):
    print( String.Format(msg, args) )
如果您想使用变量参数从python调用
logger
(并且您不介意来回转换),您可以这样做

def logger(msg, *args):
    print( String.Format(msg, Array[object](args)) )
因为将iron python对象(第一种输出情况下为元组,最后三种情况下为列表)作为单个对象处理,并且不知道您希望python集合用作
params object[]
您将获得意外的输出。调用
def logger
时,隐式创建单个python对象/元组

根据您的实际用例/风格,您可以用不同的方式解决这个问题

最具python-y风格的方式是在调用站点扩展参数,如Jeff在回答中所解释的:

def logger(msg, *args):
    print( String.Format(msg, *args) )
如果仅从CLR调用
logger
作为
Action
的实现,则可以将
args
作为
object[]类型的单个(非变量)参数

def logger(msg, args):
    print( String.Format(msg, args) )
如果您想使用变量参数从python调用
logger
(并且您不介意来回转换),您可以这样做

def logger(msg, *args):
    print( String.Format(msg, Array[object](args)) )

除非我误解了你的问题,否则这应该有效:

def logger(msg, *args):
    print(String.Format(msg, *args))

除非我误解了你的问题,否则这应该有效:

def logger(msg, *args):
    print(String.Format(msg, *args))

可能的重复如果它是那篇文章的重复,那么要么我不理解我自己的问题,要么我不理解他们的问题(或者两者都不理解:-)。我认为@HansPassant引用的问题不是一个很难重复的问题,而是暗示了一个可能的解决方案(请参阅我的答案和转换为
Array[object]
)如果它是那篇文章的副本,那么要么我不理解我自己的问题,要么我不理解他们的问题(或者两者都不理解:-)我认为@HansPassant引用的问题不是一个很难复制的问题,而是暗示了一个可能的解决方案(请参阅我的答案和转换为
Array[object]
)。谢谢,我使用了这个数组[object](args)解决方案。我完全可以使用python这一事实是一个额外的好处,因此这种对大多数用户隐藏的强制转换是完全可以接受的。谢谢,我使用了数组[object](args)解决方案。我完全可以使用python这一事实是一个额外的好处,因此这种对大多数用户隐藏的强制转换是完全可以接受的。在调用引用处扩展var-args似乎更优雅!我将检查/验证并删除我的答案,如果这对所有情况都适用。在调用引用处扩展var-args似乎更优雅!我将检查k/如果对所有情况都适用,请验证并删除我的答案。