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
相关产品推荐
相关产品推荐

