代码之家  ›  专栏  ›  技术社区  ›  Developer

使用pythonnet从python调用C#代码

  •  5
  • Developer  · 技术社区  · 7 年前

    下面是C代码。如何使用pythonnet从Python中调用NonGenericClass内的GenericMethod()?

    namespace CSharpTestCode
    {
        public interface Person
        {
        }
    
        public class Employee : Person
        {
        }
    
        public class TempGenericClass<T>
        {
        }
    
        public class NonGenericClass
        {
            public static T GenericMethod<T>(TempGenericClass<T> tempGeneric) where T : class, Person
            {
                return null;
            }
        }
    }
    

    import clr
    clr.AddReference(r'\Documents\visual studio 2015\Projects\SamplePythonApp\CSharpTestCode\bin\Debug\CSharpTestCode.dll')
    from CSharpTestCode import *
    
    genericMethod = NonGenericClass.GenericMethod(TempGenericClass[Employee]())
    

    Unhandled Exception: System.ArgumentException: GenericArguments[0], 'CSharpTestCode.TempGenericClass`1[CSharpTestCode.Employee]', on 'T GenericMethod[T](CSharpTestCode.TempGenericClass`1[T])' violates the constraint of type 'T'. ---> System.Security.VerificationException: Method CSharpTestCode.NonGenericClass.GenericMethod: type argument 'CSharpTestCode.TempGenericClass`1[CSharpTestCode.Employee]' violates the constraint of type parameter 'T'.
       at System.RuntimeMethodHandle.GetStubIfNeeded(RuntimeMethodHandleInternal method, RuntimeType declaringType, RuntimeType[] methodInstantiation)
       at System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation)
       --- End of inner exception stack trace ---
       at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e)
       at System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation)
       at Python.Runtime.MethodBinder.MatchParameters(MethodInfo[] mi, Type[] tp)
       at Python.Runtime.MethodBinder.Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, MethodInfo[] methodinfo)
       at Python.Runtime.MethodBinder.Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, MethodInfo[] methodinfo)
       at Python.Runtime.MethodObject.Invoke(IntPtr target, IntPtr args, IntPtr kw, MethodBase info)
       at Python.Runtime.MethodBinding.tp_call(IntPtr ob, IntPtr args, IntPtr kw)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   den.run.ai    7 年前

    我应该承认,pythonnet不应该崩溃CPython解释器,即使是在这个泛型调用的糟糕示例中,该方法的参数无效。

    下面是如何正确地使用pythonnet进行泛型调用,注意如何正确地传递错误的类型:

    In [3]: NonGenericClass.GenericMethod[Person](TempGenericClass[Person]())
    
    
    In [4]: NonGenericClass.GenericMethod[Employee](TempGenericClass[Employee]())
    
    
    In [5]: NonGenericClass.GenericMethod[Person](TempGenericClass[Employee]())
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-5-d13751f7586f> in <module>()
    ----> 1 NonGenericClass.GenericMethod[Person](TempGenericClass[Employee]())
    
    TypeError: No method matches given arguments
    
    
    In [6]: NonGenericClass.GenericMethod[Employee](TempGenericClass[Person]())
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-6-04c3c0db6c6b> in <module>()
    ----> 1 NonGenericClass.GenericMethod[Employee](TempGenericClass[Person]())
    
    TypeError: No method matches given arguments