You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Pythonnet从C#调用Python代码及自定义C#类的问题排查

解决C#自定义对象传递到Python后dict.keys()无法识别的问题

我来帮你搞定这个跨语言互操作的坑!你猜的没错——原生Python确实没办法直接识别C#的自定义对象(包括它的字典属性),毕竟两种语言的对象模型完全不同,原生Python根本不知道怎么解析C#的类型结构。下面给你几个实用的解决方案:

方法1:用JSON序列化传递数据(最通用)

把C#对象转成JSON字符串,传到Python后再反序列化成Python原生的字典/对象,这样就能无缝使用dict.keys()这类方法了。

C#端代码示例

// 你的自定义对象
public class MyData
{
    public bool IsValid { get; set; }
    public float Value { get; set; }
    public Dictionary<string, object> ExtraData { get; set; }
}

// 序列化对象为JSON字符串(用System.Text.Json或Newtonsoft.Json都可以)
var myData = new MyData
{
    IsValid = true,
    Value = 3.14f,
    ExtraData = new Dictionary<string, object> { {"category", "test"}, {"count", 100} }
};
string jsonData = System.Text.Json.JsonSerializer.Serialize(myData);

Python端代码示例

import json

def data_exploration(json_str):
    # 反序列化为Python原生字典
    parsed_data = json.loads(json_str)
    # 现在可以正常调用dict.keys()了
    print("ExtraData的键:", parsed_data["ExtraData"].keys())

# 传入C#传来的json_str即可
data_exploration(jsonData)

方法2:用Python.NET直接处理C#对象(推荐)

如果不想搞序列化,直接用pythonnet这个专门的互操作库,它能让Python直接识别C#的类型,包括Dictionary这类集合。

第一步:安装Python.NET

pip install pythonnet

Python端代码示例

import clr
# 加载你的C#程序集(替换成你实际的程序集名称)
clr.AddReference("YourCSharpAssembly")
from YourNamespace import MyData

def process_csharp_data(csharp_obj):
    # Python.NET会包装C#的Dictionary,但可以直接迭代Keys,或者转成Python字典
    # 方式1:直接遍历C# Dictionary的Keys
    extra_keys = [key for key in csharp_obj.ExtraData.Keys]
    print("ExtraData的键(直接遍历):", extra_keys)
    
    # 方式2:转成Python原生字典
    python_dict = dict(csharp_obj.ExtraData)
    print("ExtraData的键(转成Python字典):", python_dict.keys())

C#端只需要通过Python.NET的API把MyData对象传递给Python函数即可,Python就能正确识别所有属性了。

方法3:手动映射为Python友好的结构(无依赖)

如果不想用任何库,可以在C#里把自定义对象的所有属性手动转成Dictionary<string, object>,再传递给Python。不过本质上和JSON思路类似,只是不用序列化字符串:

public Dictionary<string, object> ToPythonCompatibleDict(MyData data)
{
    return new Dictionary<string, object>
    {
        {"IsValid", data.IsValid},
        {"Value", data.Value},
        {"ExtraData", data.ExtraData}
    };
}

不过要注意,原生Python接收C#的Dictionary还是需要基础的互操作支持,所以更推荐前两种方法。


内容的提问来源于stack exchange,提问作者anna

火山引擎 最新活动