Метод с другой сигнатурой, но производный друг от друга

У меня очень интересный вопрос, а ответа пока не нашел. Надеюсь, кто-нибудь может мне помочь.

Сначала у меня есть иерархия классов, например

interface IA {}
class A : IA {}
class B : A {}

Далее у меня есть класс с несколькими методами, все с одинаковым именем, но с разной сигнатурой и параметрами производных классов.

class Test
{
  public int Method(object dummy) { return 0; }
  public int Method(IA dummy) { return 1; }
  public int Method(A dummy) { return 2; }
  public int Method(B dummy) { return 3; }
}

Компилятор не жалуется, он распознает все разные подписи.

new Test().Method(new Object()) returns 0
new Test().Method(new A() as IA) returns 1
new Test().Method(new A()) returns 2
new Test().Method(new B()) returns 3

все, как я хотел бы ожидать.

Теперь перейдем к моему вопросу. Я должен определить во время отражения, какой из четырех методов лучше всего подходит с его сигнатурой для данного типа параметра, т. Е. Если тип параметра - typeof (A), я должен найти 3-й метод с "фиктивной" сигнатурой.

«IsInstanceOfType» или «IsAssignableFrom» не работают, поскольку «A» также является экземпляром «object». Я могу сначала проверить, точно ли совпадают типы, но это решает проблему, только если я не принимаю интерфейсы.

У кого-нибудь есть предложения?


person Wernfried    schedule 10.07.2017    source источник
comment
Чего вы пытаетесь добиться этим? Перегрузка делает то же самое, вызывая соответствующую функцию во время выполнения. Пожалуйста, укажите пример использования, чтобы мы могли лучше понять проблему.   -  person Harsh    schedule 10.07.2017
comment
Уточните пожалуйста, почему проверка на равенство не решает проблему с интерфейсами.   -  person Helmut D    schedule 10.07.2017
comment
Нельзя ли использовать перечисление в IA и устанавливать его значение в конструкторе каждого класса? Затем вы проверяете значение перечисления и вручную вызываете конкретный метод.   -  person Juan Ferrer    schedule 10.07.2017
comment
Я получаю типы и значения параметров во время сериализации, и тип вызова может быть строкой, которая в моем примере должна возвращаться к объекту. Вариант использования намного сложнее, так как параметры, которые я получаю при сериализации, не в том порядке, как в вызываемом методе, я должен их предварительно отсортировать.   -  person Wernfried    schedule 10.07.2017


Ответы (1)


Вы можете просто использовать Type.GetMethod, это найдет наиболее подходящий метод для указанных вами типов аргументов.

typeof(Test).GetMethod("Method", new[] { typeof(Object) }) // Object
typeof(Test).GetMethod("Method", new[] { typeof(IA) }) // IA
typeof(Test).GetMethod("Method", new[] { typeof(A) }) // A
typeof(Test).GetMethod("Method", new[] { typeof(B) }) // B
typeof(Test).GetMethod("Method", new[] { typeof(CultureInfo) }) // Object
typeof(Test).GetMethod("Method", new[] { typeof(int) }) // Object

Предполагая, что у вас есть тот же Test class and a new classC`:

public class C : B
{
}

если ты позвонишь

typeof(Test).GetMethod("Method", new[] { typeof(C) })

вы получите Test.Method (B dummy), так как перегрузки для типа C нет, а перегрузка с типом B наиболее применима (та, которая будет вызвана, если вы передадите ей объект типа C).

person Yeldar Kurmangaliyev    schedule 10.07.2017
comment
Спасибо за ответ, но проверьте мой комментарий выше. Поскольку типы параметров, которые я получаю, могут быть не в том же порядке, что и ожидаемый метод, я не могу использовать ваше предложение. Но я думаю, что я сделаю микс. Когда я нахожу подходящий метод на вашем пути, то я вызываю этот метод, в противном случае я пытаюсь переупорядочить свои параметры, и в этом случае тип ДОЛЖЕН совпадать. - person Wernfried; 10.07.2017