gpt4 book ai didi

c# - 在 Python 中创建一个 C# Nullable Int32(使用 Python.NET)以调用带有可选 int 参数的 C# 方法

转载 作者:太空狗 更新时间:2023-10-30 00:55:36 25 4
gpt4 key购买 nike

我正在使用 Python.NET加载 C# 程序集以从 Python 调用 C# 代码。这工作得非常干净,但是我在调​​用如下所示的方法时遇到问题:

Our.Namespace.Proj.MyRepo 中的一个方法:

OutputObject GetData(string user, int anID, int? anOptionalID= null)

我可以在存在可选的第三个参数的情况下调用该方法,但无法弄清楚要为第三个参数传递什么以匹配 null 情况。

import clr
clr.AddReference("Our.Namespace.Proj")
import System
from Our.Namespace.Proj import MyRepo

_repo = MyRepo()

_repo.GetData('me', System.Int32(1), System.Int32(2)) # works!

_repo.GetData('me', System.Int32(1)) # fails! TypeError: No method matches given arguments

_repo.GetData('me', System.Int32(1), None) # fails! TypeError: No method matches given arguments

iPython Notebook 指出最后一个参数的类型应该是:

System.Nullable`1[System.Int32]

只是不确定如何创建一个匹配 Null 情况的对象。

关于如何创建 C# 识别的 Null 对象有什么建议吗?我假设传递 native Python None 会起作用,但它不起作用。

最佳答案

[编辑]

这已经合并到 pythonnet:

https://github.com/pythonnet/pythonnet/pull/460


我遇到了与可空基元相同的问题——在我看来 Python.NET 不支持这些类型。我通过在 Python.Runtime.Converter.ToManagedValue() (\src\runtime\converter.cs) 中添加以下代码解决了这个问题

if( obType.IsGenericType && obType.GetGenericTypeDefinition() == typeof(Nullable<>) )
{
if( value == Runtime.PyNone )
{
result = null;
return true;
}
// Set type to underlying type
obType = obType.GetGenericArguments()[0];
}

我把这段代码放在了下面

if (value == Runtime.PyNone && !obType.IsValueType) {
result = null;
return true;
}

https://github.com/pythonnet/pythonnet/blob/4df6105b98b302029e524c7ce36f7b3cb18f7040/src/runtime/converter.cs#L320

关于c# - 在 Python 中创建一个 C# Nullable Int32(使用 Python.NET)以调用带有可选 int 参数的 C# 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26742837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com