我认为这可能需要向 Clay 添加一个功能,因为我们在属性的私有字段集合内以及Arrays的私有字段_behaviour
内的一个名为(集合)的私有字段下生活的细节。PropBehaviour
_props
ArrayBehaviour
_data
也许是一个新的ClayBehavior
(或更可能是对 的扩展PropBehaviour
)类似于列出所有属性ArrayBehaviour
的魔法......GetEnumerator
更新:试试这个:
public string DumpClay(dynamic clay, int indent = 0, bool appendLine = true)
{
var indentStr = new string('\t', indent);
if (!(clay is Clay))
{
return indentStr + clay.ToString()
+ (appendLine ? ((indent == 0) ? ";" : ",") + Environment.NewLine : "");
}
var sb = new StringBuilder();
if (IsArray(clay))
{
sb.Append(indentStr).AppendLine("[");
foreach (var item in clay)
{
sb.AppendLine(DumpClay(item, indent + 2));
}
sb.Append(indentStr).Append("]");
}
PropBehavior behaviour;
if (IsProp(clay, out behaviour))
{
if (sb.Length > 0)
{
sb.AppendLine();
}
sb.Append(indentStr).AppendLine("{");
foreach (var pair in GetProps(behaviour))
{
sb.Append(DumpClay(pair.Key, indent + 1, appendLine: false)).AppendLine(":")
.Append(DumpClay(pair.Value, indent + 2));
}
sb.Append(indentStr).Append("}");
}
if (appendLine)
{
sb.AppendLine((indent == 0) ? ";" : ",");
}
return sb.ToString();
}
private static bool IsArray(Clay clay)
{
var behaviours = GetBehaviorCollection(clay);
var arrayBehaviour = behaviours.FirstOrDefault(clayBehavior => clayBehavior is ArrayBehavior);
return (arrayBehaviour != null);
}
private static bool IsProp(Clay clay, out PropBehavior propBehavior)
{
var behaviours = GetBehaviorCollection(clay);
propBehavior = (PropBehavior)behaviours.FirstOrDefault(clayBehavior => clayBehavior is PropBehavior);
return (propBehavior != null);
}
private static IEnumerable<IClayBehavior> GetBehaviorCollection(Clay clay)
{
// ReSharper disable PossibleNullReferenceException
return (ClayBehaviorCollection)typeof(Clay)
.GetField("_behavior", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(clay);
// ReSharper restore PossibleNullReferenceException
}
private static IEnumerable<KeyValuePair<object, object>> GetProps(PropBehavior propBehavior)
{
// ReSharper disable PossibleNullReferenceException
return (Dictionary<object, object>)typeof(PropBehavior)
.GetField("_props", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(propBehavior);
// ReSharper restore PossibleNullReferenceException
}
上述示例输出:
[
{
ShapeName:
Person,
FirstName:
Louis,
LastName:
Dejardin,
Aliases:
System.String[],
},
{
ShapeName:
Person,
FirstName:
Bertrand,
LastName:
Le Roy,
Aliases:
[
bleroy,
boudin,
]
{
},
},
{
ShapeName:
Person,
FirstName:
Renaud,
LastName:
Paquay,
Aliases:
[
Your Scruminess,
Chef,
]
{
},
},
]
{
Name:
Some Orchard folks,
};