You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pythonnet中如何以成员方式调用C#扩展方法及使用Linq?

问题解答

1. 将C#自定义扩展方法转为Python实例调用形式

Pythonnet不会自动将C#扩展方法映射为Python对象的实例方法,但可以通过手动绑定实现类似object.MyExtension()的调用,两种常用方案如下:

方案一:直接给.NET类型添加Python方法

找到目标.NET类(如MyClass),在Python中给它绑定对应方法,内部调用C#扩展方法的静态实现:

import clr
clr.AddReference("你的程序集名称")
from 你的命名空间 import ObjectExtensions, MyClass

# 定义Python方法,将self作为参数传入C#扩展方法
def my_extension(self):
    return ObjectExtensions.MyExtension(self)

# 把方法绑定到MyClass的Python类型上
MyClass.MyExtension = my_extension

# 实例调用示例
obj = MyClass()
obj.MyExtension()

方案二:创建Python包装类

若不想修改原.NET类型的绑定,可编写包装类封装.NET对象并提供实例方法:

import clr
clr.AddReference("你的程序集名称")
from 你的命名空间 import ObjectExtensions, MyClass

class MyClassWrapper:
    def __init__(self, inner_obj=None):
        self.inner = inner_obj or MyClass()
    
    def MyExtension(self):
        return ObjectExtensions.MyExtension(self.inner)

# 包装类调用示例
wrapper = MyClassWrapper()
wrapper.MyExtension()

2. 在Pythonnet中使用Linq的Where、Select、ForEach方法

Linq核心方法都在System.Linq.Enumerable静态类中,可直接调用静态方法,也可手动绑定为实例方法实现链式调用:

直接调用静态方法

pythonnet会自动将Python lambda转换为C#委托,直接调用静态方法即可:

import clr
clr.AddReference("System.Core")
from System.Linq import Enumerable
from System.Collections.Generic import List

# 创建.NET List实例
num_list = List[int]()
num_list.AddRange([1,2,3,4,5])

# 使用Where过滤
filtered = Enumerable.Where(num_list, lambda x: x % 2 == 0)
# 使用Select转换
mapped = Enumerable.Select(filtered, lambda x: x * 10)
# 转为Python列表查看结果
print(list(mapped))  # 输出: [20,40]

# 对IEnumerable使用ForEach执行操作
Enumerable.ForEach(mapped, lambda x: print(x))

若为List<T>类型,本身自带实例方法ForEach,可直接调用:

num_list.ForEach(lambda x: print(f"元素: {x}"))

绑定为实例方法实现链式调用

若习惯C#的链式写法,可给IEnumerable类型绑定对应实例方法:

import clr
clr.AddReference("System.Core")
from System.Linq import Enumerable
from System.Collections import IEnumerable

# 给IEnumerable添加Where方法
def where(self, predicate):
    return Enumerable.Where(self, predicate)

# 添加Select方法
def select(self, selector):
    return Enumerable.Select(self, selector)

# 绑定到IEnumerable的Python类型上
IEnumerable.Where = where
IEnumerable.Select = select

# 链式调用示例
num_list = List[int]([1,2,3,4,5])
result = num_list.Where(lambda x: x>2).Select(lambda x: x+10)
print(list(result))  # 输出: [13,14,15]

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:30:15