gpt4 book ai didi

c# - 在 C# 中使用 Clay 构建转储对象

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:07 25 4
gpt4 key购买 nike

有什么方法可以在 C# 中使用 ClaySharp 将对象转储到控制台/日志文件构建?

Clay 是一种动态 C# 类型,可让您像使用 JavaScript 或其他动态语言一样轻松地雕刻任何形状的对象。 Project Link

用 Clay 构建 Ex 对象:

// Build a Clay object
dynamic New = new ClayFactory();

dynamic directory = New.Array(
New.Person(
FirstName: "Louis",
LastName: "Dejardin",
Aliases: new[] { "Lou" }
),
New.Person(
FirstName: "Bertrand",
LastName: "Le Roy"
).Aliases("bleroy", "boudin"),
New.Person(
FirstName: "Renaud",
LastName: "Paquay"
).Aliases("Your Scruminess", "Chef")
).Name("Some Orchard folks");

最佳答案

我认为这可能需要向 Clay 添加一个功能,因为我们所追求的细节存在于 PropBehaviour 中名为 _behaviour(集合)的私有(private)字段下属性的私有(private)字段 _props 集合,以及 ArrayBehaviour 的私有(private)字段 _data 中的数组。

可能是一个新的 ClayBehavior(或者更可能是 PropBehaviour 的扩展)类似于 ArrayBehaviourGetEnumerator列出所有属性的魔法...


更新:试试这个:

    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,
};

关于c# - 在 C# 中使用 Clay 构建转储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5075649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com