public static Delegate MakeSerializable(Delegate d)
{
if (d == null)
return null;
Delegate[] children = d.GetInvocationList();
if (children.Length == 0)
return null;
else if (children.Length == 1 && d == children[0])
{
// Non-combined delegate
if (d.Method.IsPublic)
return d;
else
return null;
}
else
{
ArrayList publicChildren = new ArrayList(children.Length);
foreach (Delegate child in children)
{
Delegate publicChild = MakeSerializable(child);
if (publicChild != null)
publicChildren.Add(publicChild);
}
if (publicChildren.Count == 0)
return null;
else if (publicChildren.Count == 1)
return (Delegate)publicChildren[0];
else
{
Delegate[] publicChildrenArray = new Delegate[publicChildren.Count];
for (int i = 0; i < publicChildren.Count; ++i)
publicChildrenArray[i] = (Delegate)publicChildren[i];
return Delegate.Combine(publicChildrenArray);
}
}
}