era*_*zap 2 c# recursion yield
我正在尝试创建一个
IEnumrable<PropertyInfo>
Run Code Online (Sandbox Code Playgroud)
我有一个名为Disassemble的方法,它以递归方式迭代抛出一个给定的对象及其所有属性的子对象.
请不要关注INameValueWrapper类型的Inner包装器对象
下面的问题是当我遇到一个属性,它是一个类我不想在它上面调用Disassemble并将它添加到IEnumrable的同一个迭代中,当它被调用时,Dissasemble不再出现在我放置注释的地方: //问题出在这里.
public static IEnumerable<T> Dissasemble<T>(this object sourceObj) where T : INameValueWrapper
{
var properties = sourceObj.GetType().GetProperties();
foreach (var prop in properties)
{
var wrapper = (T)prop.WrapPropertyInfo(sourceObj);
yield return wrapper;
if (wrapper is CollectionPropertyInfoWrapper)
{
var colWrapper = wrapper as CollectionPropertyInfoWrapper;
var collection = (IList)colWrapper.Value;
int index = 0;
foreach (var item in collection)
{
yield return (T)item.WrapItem(collection, index + 1);
index++;
}
}
else
{
var propWrapper = wrapper as PropertyInfoWrapper;
if (!propWrapper.IsPrimitive)
{
var childObject = prop.GetValue(sourceObj);
childObject.Dissasemble<T>(); // here is the problem
}
}
}
yield break;
}
Run Code Online (Sandbox Code Playgroud)
1)为什么不调用它并添加到迭代中?
2)围绕这个问题的工作是什么?,
i could call childObject.Dissasemble<T>().ToList()
and then iterate that collection calling yield return on it's items
but that seems like re doing something i already did.
Run Code Online (Sandbox Code Playgroud)
提前致谢.
您正在调用该方法,但忽略了结果.您可能需要以下内容:
foreach (var item in childObject.Disassemble<T>())
{
yield return item;
}
Run Code Online (Sandbox Code Playgroud)
我认为你yield return对它的作用有点困惑- 它只会在当前执行方法返回的序列中产生一个值.它不会为某些全局序列添加值.如果忽略递归Disassemble调用返回的值,则代码甚至不会执行,因为迭代器块是惰性的.(它们仅在被要求提供其他值时才执行代码.)
此外,您不需要yield break;在方法的最后.
请注意,如果递归深入,则使用迭代器块可能效率低下.这对你来说可能不是一个问题,但这是值得思考的问题.请参阅Wes Dyer和Eric Lippert关于此的帖子.