首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MetaLama在ToString TypeAspect中序列化列表或数组

如何使用MetaLama在ToString TypeAspect中序列化列表或数组
EN

Stack Overflow用户
提问于 2022-04-18 14:30:28
回答 1查看 64关注 0票数 0

我正在尝试使用TypeAspect framwerok编写一个MetaLama,当对象具有嵌套列表类型时,该框架将对象序列化为它的字符串表示形式。以下是我尝试过的:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2022-05-09 13:36:46

此代码将检查类型是否可枚举:

代码语言:javascript
复制
var returnsEnumerable =
 type is INamedType namedType 
  && !type.Is( SpecialType.String )
  && namedType.AllImplementedInterfaces.Any( i => i.Name == "IEnumerable" );

你可以在网上试试

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71913138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档