C#: вызов заранее неизвестного метода
хотя давай поподробнее что нужно в итоге?
ну и в твоем случае вроде можно просто if-ом обойтись
if не хочется - очень большой case получится.
Либо Reflection, либо динамический тип.
динамики и рефлекшины гораздо более затратны и юзаются в совсем крайних случаях.
Вместо case буду делать так
public abstract class Behaviour : MonoBehaviour {
public abstract void Do(int Action);
}
...
Behaviour c = this.GetComponent(this.name + "Behaviour") as Behaviour; // поскольку исходники позволяют искать дополнительный компонент по строке
if (c != null)
c.Do(5);
P.S. Это шкодинг в Unity
больно бил бы за такой стиль. но тебе виднее. ты ведь так и не сказал что в итоге тебе нужно?
Как смог, так и сказал. Ожидать, что здесь кто-то знает Unity или описывать, как и что там делает, а потом спрашивать, несколько странно.
Да и думал, может есть штатная возможность это выполнять, как в том же php.
2 : "Настоящий программист может писать на Фортране на любом языке". Твое решение приемлемо, но на сишарпе "принято" писать по-другому.
// если нужно бросить исключение если метод не найден
a.GetType.GetMethod(string.Format("method{0}", i .Invoke(a, null);
// если исключение бросать не нужно
System.Reflection.MethodInfo m;
if ( ( m = a.GetType.GetMethod(string.Format("method{0}",i != null)
m.Invoke(a, null);
// Если нужно часто использовать
public static class MyExtensions
{
public static InvokeMethod( this object a, string name, object[] param = null )
{
if ( a == null )
return;
System.Reflection.MethodInfo m;
if ( ( m = a.GetType.GetMethod(name != null)
m.Invoke(a, param);
}
}
...
в коде
a.InvokeMethod( "method1");
a.InvokeMethod( "method2");
a.InvokeMethod( "method3");
попробуй reflection, но это может закончится восстанием машин
Сначала сделал через динамический вызов, как написал выше. Потом через наследование и переопределение родительского метода.
добавив абстрактный классИнтерфейс же
Обошелся, добавив абстрактный класс, от которого буду наследовать классы.
Вместо case буду делать так
code:
public abstract class Behaviour : MonoBehaviour {
public abstract void Do(int Action);
}
...
Behaviour c = this.GetComponent(this.name + "Behaviour") as Behaviour; // поскольку исходники позволяют искать дополнительный компонент по строке
if (c != null)
c.Do(5);
P.S. Это шкодинг в Unity
Будь готов, что через пару лет в твою карму будут активно поступать лучи поноса от того, кто будет поддерживать этот код...
А вообще это яркий пример того, как весьма разумный паттерн (IoC/DI) и фреймворк (Unity превращаются в глазах общественности в говно из-за того, что кто-то решил сделать "в С# также как и php".
, написал же, что сделал уже через промежуточный класс и наследование. Код этот поддерживать никто не будет - это Unity, т.е. игровой движок.
Оставить комментарий
0000
Допустим есть классМожно ли в C# сделать что-то типа такого?
php аналог - call_user_func