Сообщение Re[12]: Приоритет вызова перегруженных методов от 09.06.2016 7:13
Изменено 09.06.2016 8:41 Serginio1
Здравствуйте, Sinix, Вы писали:
S>Не вопрос, как сделаете корректное разруливание перегрузок по значениям аргументов в GetMethod() — так сразу и приходите.
Идея такая создаем класс для сравнения
Тип для IsByRef узнаем через GetElementType();
Для примера с CallA создаем массив по параметрам.
Для методов params разврачиваем params в массив параметров но нужного количества. В примере с
разворачиваем до
Если аргументы равны, то сравниваем сначала по params, а затем по количеству аргументов (сначала идут с большим аргументом)
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, а затем по количеству аргументов (сначала идут с большим аргументом)
Здравствуйте, Sinix, Вы писали:
S>Не вопрос, как сделаете корректное разруливание перегрузок по значениям аргументов в GetMethod() — так сразу и приходите.
Идея такая создаем класс для сравнения
Тип для IsByRef узнаем через GetElementType();
Для примера с CallA создаем массив по параметрам.
Для методов params разврачиваем params в массив параметров но нужного количества. В примере с
разворачиваем до
Если аргументы равны, то сравниваем сначала по params, а затем по количеству аргументов (сначала идут с большим аргументом)
То есть
static public void CallA(int arg1,params int[] args)
идет раньше, чем
static public void CallA(params int[] args)
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, а затем по количеству аргументов (сначала идут с большим аргументом)
То есть
static public void CallA(int arg1,params int[] args)
идет раньше, чем
static public void CallA(params int[] args)