무한루프라던가 뭔가 걸러내도 몇단계 이후에는 답을 못줄정도로 연산이 너무 오래걸려서 분석이고 뭐고 폐기
public static IEnumerable<(IEnumerable<object> stack, T result)> Find<T>(object target) => find<T>(target, Enumerable.Empty<object>());
static IEnumerable<(IEnumerable<object> stack, T result)> find<T>(object? target, IEnumerable<object> stack)
{
if (target is ValueType) yield break;
if (target is null) yield break;
if (stack.Count() > 4) yield break;
if (stack.Contains(target)) yield break; //재귀제거
if (target is T t)
{
yield return (stack, t);
yield break;
}
stack = stack.Append(target); //하위를 찾아봐야함.
if (target is Array e)
{
foreach (var i in e)
foreach (var f in find<T>(i, stack)) yield return f;
yield break;
}
foreach (var pi in target.GetType().GetProperties())
if (pi.CanRead && pi.GetMethod?.GetParameters() is [])
foreach (var f in find<T>(pi.GetValue(target), stack)) yield return f;
foreach (var fi in target.GetType().GetFields())
foreach (var f in find<T>(fi.GetValue(target), stack)) yield return f;
}
댓글 0