private void GetManyDependencyByType(Type type, out object dependency)
{
var elementType = type.GetElementType();
var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(elementType);
var list = (IList)Activator.CreateInstance(constructedListType);
foreach (var item in _containerList)
{
if (elementType.IsInstanceOfType(item))
{
list.Add(item);
}
}
var array = Array.CreateInstance(elementType, list.Count);
list.CopyTo(array, 0);
dependency = array;
}
private bool TryGetDependencyByType(Type type, out object dependency)
{
if (type.IsArray)
{
GetManyDependencyByType(type, out dependency);
return true;
}
return TryGetSingleDependencyByType(type, out dependency);
}
private void GetManyDependencyByType(Type type, out object dependency)
{
var elementType = type.GetElementType();
var mas = new List<object>();
foreach (var item in _containerList)
{
if (elementType.IsInstanceOfType(item))
{
mas.Add(item);
}
}
dependency = mas.ToArray();
}
private bool TryGetSingleDependencyByType(Type type, out object dependency)
{
foreach (var item in _containerList)
{
if (type.IsInstanceOfType(item))
{
dependency = item;
return true;
}
}
dependency = null;
return false;
}
private void InjectMethod(object target, MethodBase methodInfo)
{
// Берем параметры метода
var parametersInfo = methodInfo.GetParameters();
// Создаем массив параметров которые будем передавать в метод
var parameters = new object[parametersInfo.Length];
var index = 0;
// Проходимся по параметрам метода и находим подходящую зависимость
foreach (var parameterInfo in parametersInfo)
{
// foundDependency содержит нужный параметр, либо Массив нужных параметров если в методе
// встретился массив для заполнения
// Пример такого метода A(Test test, ITest[] itests)
if (TryGetDependencyByType(parameterInfo.ParameterType, out var foundDependency))
{
parameters[index] = foundDependency;
Debug.Log(foundDependency.GetType().IsArray);
index++;
}
else
{
return;
}
}
// Вызываем метод, передавая найденные зависимости, среди них может быть массив
methodInfo.Invoke(target, parameters);
}
[Serializable]
public class Temp
{
[SerializeField]
private A _class1;
[SerializeField]
private A _class2;
public void OnGUI ()
{
if (_class1 == null)
_class1 = new A ();
if (_class2 == null)
_class2 = _class1;
_class1.OnGUI();
_class2.OnGUI();
}
}