Добрый день,
После определения делегата универсального типа я создаю делегат на основе различных методов, вводящих первый аргумент (T1), поэтому при его вызове остается только второй аргумент (T2),Проблема в том, что, хотя он «технически» принимает операцию, входные данные при вызове функции становятся странными для функции «Invoke», но корректны для «DynamicInvoke».Вот два примера (обратите внимание, я использую Unity, поэтому я использую класс Vector2 и метод Debug.Log вместо Console.WriteLine):
public delegate T TDelegate<T, T1>(T1 arg1);
public delegate T TDelegate<T, T1, T2>(T1 arg1, T2 arg2);
public struct AuxSegment
{
public Vector2 p1;
public Vector2 p2;
public AuxSegment (Vector2 n1, Vector2 n2) { p1 = n1; p2 = n2; }
public string ToString () { return "" + p1.ToString() + ", " + p2.ToString(); }
}
public static bool Method1 (char arg1, string arg2)
{
Debug.Log("arg1(char) -> " + arg1 + " arg2(string) -> " + arg2);
return true;
}
public static bool Method2 (Vector2 arg1, AuxSegment arg2)
{
Debug.Log("arg1(Vector2) -> " + arg1.ToString() + " arg2(AuxSegment) -> " + arg2.ToString());
return true;
}
public void main () {
char mt1arg1 = 'c';
string mt1arg2 = "xyz";
Vector2 mt2arg1 = new Vector2(1,1);
AuxSegment mt2arg2 = new AuxSegment(new Vector2(5,0), new Vector2(5,10));
var mt1 = ((TDelegate<bool, char, string>)Method1).Method;
var mt2 = ((TDelegate<bool, Vector2, AuxSegment>)Method2).Method;
var del1 = (TDelegate<bool, string>) Delegate.CreateDelegate(typeof(TDelegate<bool, string>), mt1arg1, mt1);
var del2 = (TDelegate<bool, AuxSegment>) Delegate.CreateDelegate(typeof(TDelegate<bool, AuxSegment>), mt2arg1, mt2);
Debug.Log("Target/1st arg of Method1 -> " + del1.Target);
Debug.Log("Target/1st arg of Method2 -> " + del2.Target);
Debug.Log("\nDynamic Invoke:");
del1.DynamicInvoke(mt1arg2);
del2.DynamicInvoke(mt2arg2);
Debug.Log("\nInvoke:");
del1.Invoke(mt1arg2);
del2.Invoke(mt2arg2);
}
И вот результат вывода:
Target/1st arg of Method1 -> a
Target/1st arg of Method2 -> (1.0, 1.0)
Dynamic Invoke:
arg1(char) -> a arg2(string) -> xyz
arg1(Vector2) -> (1.0, 1.0) arg2(AuxSegment) -> (5.0, 0.0), (5.0, 10.0)
Invoke:
arg1(char) -> 揀 arg2(string) -> xyz
arg1(Vector2) -> (5.0, 0.0) arg2(AuxSegment) -> (5.0, 10.0), (0.0, 0.0)
Почему в Method1 "char" переводится неправильно?Почему в Method2 есть странное переключение аргументов даже во втором аргументе?(arg1 равно arg2.p1, arg2.p1 равно arg2.p2, а arg2.p2 равно нулю) Я должен отметить, что это происходит для каждого подобного случая, который я пробовал.Есть ли возможное решение без использования DynamicInvoke, поскольку оно не очень эффективно?
Приносим извинения за неудобства и большое спасибо.