Информация об изменениях

Сообщение Re[12]: Приоритет вызова перегруженных методов от 09.06.2016 7:13

Изменено 09.06.2016 8:35 Serginio1

Здравствуйте, Sinix, Вы писали:
S>Не вопрос, как сделаете корректное разруливание перегрузок по значениям аргументов в GetMethod() — так сразу и приходите.

Идея такая создаем класс для сравнения

public class ИнформацияОТипе: IComparable<ИнформацияОТипе>
    {
        Type Тип;
        bool IsByRef;
        bool IsValue;
        int УровеньИерархии;

      public  int CompareTo(ИнформацияОТипе elem)
        {
            if (Тип == elem.Тип)
                return 0;

            int res = -IsByRef.CompareTo(elem.IsByRef);

            if (res != 0) return res;

            res = -IsValue.CompareTo(elem.IsValue);

            if (res != 0) return res;


            res = -IsValue.CompareTo(elem.IsValue);

            if (res != 0) return res;

            res = -УровеньИерархии.CompareTo(elem.УровеньИерархии);

            if (res != 0) return res;

            return Тип.ToString().CompareTo(elem.Тип.ToString());
        }
    }


Тип для IsByRef узнаем через GetElementType();
var tint = typeof(int).MakeByRefType().GetElementType();



Для примера с CallA создаем массив по параметрам.
Для методов params разврачиваем params в массив параметров но нужного количества. В примере с
static public void CallA(params int[] args)


разворачиваем до
static public void CallA(int arg1,int arg1)



Если аргументы равны, то сравниваем сначала по params, а затем по количеству аргументов (сначала идут с большим аргументом)
Здравствуйте, Sinix, Вы писали:
S>Не вопрос, как сделаете корректное разруливание перегрузок по значениям аргументов в GetMethod() — так сразу и приходите.

Идея такая создаем класс для сравнения

public class ИнформацияОТипе: IComparable<ИнформацияОТипе>
    {
        Type Тип;
        bool IsByRef;
        bool IsValue;
        int УровеньИерархии;

      public  int CompareTo(ИнформацияОТипе elem)
        {
            
            int res = -IsByRef.CompareTo(elem.IsByRef);

            if (res != 0) return res;

            if (Тип == elem.Тип)
                return 0;


            res = -IsValue.CompareTo(elem.IsValue);

            if (res != 0) return res;


            res = -IsValue.CompareTo(elem.IsValue);

            if (res != 0) return res;

            res = -УровеньИерархии.CompareTo(elem.УровеньИерархии);

            if (res != 0) return res;

            return Тип.ToString().CompareTo(elem.Тип.ToString());
        }
    }


Тип для IsByRef узнаем через GetElementType();
var tint = typeof(int).MakeByRefType().GetElementType();



Для примера с CallA создаем массив по параметрам.
Для методов params разврачиваем params в массив параметров но нужного количества. В примере с
static public void CallA(params int[] args)


разворачиваем до
static public void CallA(int arg1,int arg1)



Если аргументы равны, то сравниваем сначала по params, а затем по количеству аргументов (сначала идут с большим аргументом)