Ответ 1
pythonnet
метода pythonnet
(метод Bind
найденный в файле methodbinder.cs
) может быть улучшено довольно много ИМХО. В любом случае, этот метод в настоящее время не заботится о иерархиях типов.
Одним из простых решений является изменение класса MethodSorter
поэтому он поддерживает производный класс, когда он сортирует методы, чтобы определить, какой из них будет выбран по вызову Bind
.
До:
internal class MethodSorter : IComparer
{
int IComparer.Compare(object m1, object m2)
{
int p1 = MethodBinder.GetPrecedence((MethodBase)m1);
int p2 = MethodBinder.GetPrecedence((MethodBase)m2);
if (p1 < p2)
{
return -1;
}
if (p1 > p2)
{
return 1;
}
return 0;
}
}
После:
internal class MethodSorter : IComparer
{
int IComparer.Compare(object m1, object m2)
{
var me1 = (MethodBase)m1;
var me2 = (MethodBase)m2;
if (me1.DeclaringType != me2.DeclaringType)
{
// m2 type derives from m1 type, favor m2
if (me1.DeclaringType.IsAssignableFrom(me2.DeclaringType))
return 1;
// m1 type derives from m2 type, favor m1
if (me2.DeclaringType.IsAssignableFrom(me1.DeclaringType))
return -1;
}
int p1 = MethodBinder.GetPrecedence((MethodBase)m1);
int p2 = MethodBinder.GetPrecedence((MethodBase)m2);
if (p1 < p2)
{
return -1;
}
if (p1 > p2)
{
return 1;
}
return 0;
}
}
Примечание. Я не проводил расширенных тестов, поэтому я не уверен, что это не сломает что-то еще. Как я уже сказал, весь этот код привязки кода кажется хрупким.