我正在尝试使用TypeAspect framwerok编写一个MetaLama,当对象具有嵌套列表类型时,该框架将对象序列化为它的字符串表示形式。以下是我尝试过的:
public class ToStringAttribute : TypeAspect
{
[Introduce(WhenExists = OverrideStrategy.Override, Name = "ToString")]
public string IntroducedToString()
{
var stringBuilder = new InterpolatedStringBuilder();
stringBuilder.AddText(meta.Target.Type.Name);
stringBuilder.AddText(" ");
var fields = meta.Target.Type.FieldsAndProperties.Where(f => !f.IsStatic)
.ToList();
var i = meta.CompileTime(0);
stringBuilder.AddText("{ ");
foreach (var field in fields)
{
if (i > 0)
{
stringBuilder.AddText(", ");
}
stringBuilder.AddText(field.Name);
stringBuilder.AddText(" : ");
if (field.Type.ToType() == typeof(string))
{
stringBuilder.AddText("'");
stringBuilder.AddExpression(field.Invokers.Final.GetValue(meta.This));
stringBuilder.AddText("'");
}
else if ((field.Type.ToType().IsArray || field.Type.ToType().IsCollectible) && !field.Type.ToType().IsPrimitive) // <- not filtering collection types
{
stringBuilder.AddText("[");
//foreach (var item in meta.Target.Type.FieldsAndProperties.Where(p => p.Type.ToType().IsCollectible)) <- I need the collection type properties
//{
//stringBuilder.AddExpression(item);
//stringBuilder.AddText(" : ");
//stringBuilder.AddExpression(item.Value);
//}
stringBuilder.AddText("]");
}
else
{
stringBuilder.AddExpression(field.Invokers.Final.GetValue(meta.This));
}
i++;
}
stringBuilder.AddText(" }");
return stringBuilder.ToValue();
}
}
}有人能帮忙吗?我是MetaLama的新手,但我发现它很有趣。thnx
发布于 2022-05-09 13:36:46
此代码将检查类型是否可枚举:
var returnsEnumerable =
type is INamedType namedType
&& !type.Is( SpecialType.String )
&& namedType.AllImplementedInterfaces.Any( i => i.Name == "IEnumerable" );你可以在网上试试
https://stackoverflow.com/questions/71913138
复制相似问题