XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension

change-XFEConverter:ObjectInfo中,添加原始的PropertyInfo和FieldInfo信息以及Parent对象

23d3e59
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

8 个文件 +106 -41
Modified XFEExtension.NetCore.Test/Program.cs +24 -3
@@ -1,7 +1,9 @@
1 using XFEExtension.NetCore.FileExtension;
2 using XFEExtension.NetCore.StringExtension;
1 using XFEExtension.NetCore.StringExtension;
2 using XFEExtension.NetCore.Test;
3 3 using XFEExtension.NetCore.XFEChatGPT;
4 using XFEExtension.NetCore.XFETransform.JsonConverter;
4 using XFEExtension.NetCore.XFETransform;
5 using XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
6 using XFEExtension.NetCore.XFETransform.StringConverter;
5 7
6 8 internal class Program
7 9 {
@@ -21,6 +23,25 @@ internal class Program
21 23 { "测试3", "测测" },
22 24 { "测试4", "测测" }
23 25 }.X();
26 var testClass = new TestClass("张三", "测试秒睡", 14)
27 {
28 Enum = MyEnum.Test1,
29 OS = 1,
30 MyProperty = true,
31 Tags = [["测试1", "ce"], ["ce2", "ce3"]],
32 SubClass = new()
33 {
34 InnerClass = new()
35 {
36 Name = "李四",
37 Description = "李四的描述"
38 }
39 }
40 };
41 var result = XFEConverter.GetObjectInfo(StringConverter.ObjectAnalyzer, "分析对象", ObjectPlace.Main, 0, [testClass], testClass.GetType(), testClass, false, true, false);
42 var targetField = result.SubObjects[9].SubObjects[0].SubObjects[0];
43 targetField.FieldInfo.SetValue(targetField.Parent.Value, "王五");
44 Console.WriteLine(result.OutPutObject());
24 45 }
25 46
26 47 private static void XFEChatGPT_XFEChatGPTMessageReceived(object? sender, XFEExtension.NetCore.XFEChatGPT.ChatGPTInnerClass.HelperClass.MemorableGPTMessageReceivedEventArgs e)
Modified XFEExtension.NetCore.Test/TestClass.cs +12 -0
@@ -9,11 +9,23 @@ internal class TestClass(string name, string description, int age)
9 9 public string Name { get; set; } = name;
10 10 public List<List<string>> Tags { get; set; }
11 11 public bool MyProperty { get; set; }
12 public SubClass? SubClass;
12 13 public MyEnum Enum { get; set; }
13 14 public string Description { get; set; } = description;
14 15 public int Age { get; set; } = age;
15 16 }
16 17
18 class SubClass
19 {
20 public required InnerClass InnerClass;
21 }
22
23 class InnerClass
24 {
25 public required string Name;
26 public required string Description;
27 }
28
17 29 internal class EmptyClass { }
18 30 enum MyEnum
19 31 {
Modified XFEExtension.NetCore/XFEExtension.NetCore.csproj +3 -3
@@ -5,7 +5,7 @@
5 5 <ImplicitUsings>enable</ImplicitUsings>
6 6 <Nullable>enable</Nullable>
7 7 <GenerateDocumentationFile>True</GenerateDocumentationFile>
8 <Version>3.2.0</Version>
8 <Version>3.2.1</Version>
9 9 <Title>XFEExtension</Title>
10 10 <RepositoryUrl>https://github.com/XFEstudio/XFEExtension</RepositoryUrl>
11 11 <AnalysisLevel>latest</AnalysisLevel>
@@ -21,11 +21,11 @@
21 21 <PackageReleaseNotes>
22 22 ## 调整
23 23
24
24 XFEConverter:ObjectInfo中,添加原始的PropertyInfo和FieldInfo信息以及Parent对象
25 25
26 26 ## 新增
27 27
28 新增流程控制语句,现在,你可以通过抛出StopAction异常来执行方法并抛出异常,从而穿插在代码中
28
29 29
30 30 ## 严重
31 31
Modified XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/IObjectInfo.cs +14 -1
@@ -1,4 +1,5 @@
1 using XFEExtension.NetCore.XFETransform.StringConverter;
1 using System.Reflection;
2 using XFEExtension.NetCore.XFETransform.StringConverter;
2 3
3 4 namespace XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
4 5
@@ -32,6 +33,14 @@ public interface IObjectInfo
32 33 /// </summary>
33 34 Type? Type { get; init; }
34 35 /// <summary>
36 /// 字段信息
37 /// </summary>
38 FieldInfo? FieldInfo { get; init; }
39 /// <summary>
40 /// 属性信息
41 /// </summary>
42 PropertyInfo? PropertyInfo { get; init; }
43 /// <summary>
35 44 /// 对象值
36 45 /// </summary>
37 46 object? Value { get; init; }
@@ -40,6 +49,10 @@ public interface IObjectInfo
40 49 /// </summary>
41 50 ObjectPlace ObjectPlace { get; init; }
42 51 /// <summary>
52 /// 父对象信息
53 /// </summary>
54 IObjectInfo? Parent { get; set; }
55 /// <summary>
43 56 /// 对象层级
44 57 /// </summary>
45 58 int Layer { get; init; }
Modified XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/ObjectInfo.cs +11 -3
@@ -1,4 +1,5 @@
1 using XFEExtension.NetCore.XFETransform.StringConverter;
1 using System.Reflection;
2 using XFEExtension.NetCore.XFETransform.StringConverter;
2 3
3 4 namespace XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
4 5
@@ -13,14 +14,19 @@ internal abstract class ObjectInfo : IObjectInfo
13 14 public bool IsArray { get; init; }
14 15 public ISubObjects? SubObjects { get; init; }
15 16 public IStringConverter? StringConverter { get; init; }
17 public FieldInfo? FieldInfo { get; init; }
18 public PropertyInfo? PropertyInfo { get; init; }
19 public IObjectInfo? Parent { get; set; }
16 20
17 21 public string OutPutObject()
18 22 {
19 23 return StringConverter!.OutPutObject(this);
20 24 }
21 25
22 public ObjectInfo(IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, object? value = null)
26 public ObjectInfo(FieldInfo? fieldInfo, PropertyInfo? propertyInfo, IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, object? value = null)
23 27 {
28 FieldInfo = fieldInfo;
29 PropertyInfo = propertyInfo;
24 30 StringConverter = stringConverter;
25 31 Name = name;
26 32 ObjectPlace = objectPlace;
@@ -30,8 +36,10 @@ internal abstract class ObjectInfo : IObjectInfo
30 36 IsArray = false;
31 37 Value = value;
32 38 }
33 public ObjectInfo(IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, bool isArray, object? value = null, List<IObjectInfo>? objectInfoList = null)
39 public ObjectInfo(FieldInfo? fieldInfo, PropertyInfo? propertyInfo, IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, bool isArray, object? value = null, List<IObjectInfo>? objectInfoList = null)
34 40 {
41 FieldInfo = fieldInfo;
42 PropertyInfo = propertyInfo;
35 43 StringConverter = stringConverter;
36 44 Name = name;
37 45 ObjectPlace = objectPlace;
Modified XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/ObjectInfoImpl.cs +4 -3
@@ -1,13 +1,14 @@
1 using XFEExtension.NetCore.XFETransform.StringConverter;
1 using System.Reflection;
2 using XFEExtension.NetCore.XFETransform.StringConverter;
2 3
3 4 namespace XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
4 5
5 6 internal class ObjectInfoImpl : ObjectInfo
6 7 {
7 public ObjectInfoImpl(IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, object? value = null) : base(stringConverter, name, objectPlace, layer, type, isBasicType, value)
8 public ObjectInfoImpl(FieldInfo? fieldInfo, PropertyInfo? propertyInfo, IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, object? value = null) : base(fieldInfo, propertyInfo, stringConverter, name, objectPlace, layer, type, isBasicType, value)
8 9 {
9 10 }
10 public ObjectInfoImpl(IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, bool isArray, object? value, List<IObjectInfo>? objectInfoList = null) : base(stringConverter, name, objectPlace, layer, type, isBasicType, isArray, value, objectInfoList)
11 public ObjectInfoImpl(FieldInfo? fieldInfo, PropertyInfo? propertyInfo, IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, Type? type, bool isBasicType, bool isArray, object? value, List<IObjectInfo>? objectInfoList = null) : base(fieldInfo, propertyInfo, stringConverter, name, objectPlace, layer, type, isBasicType, isArray, value, objectInfoList)
11 12 {
12 13 }
13 14 }
Modified XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/SubObjectsBase.cs +11 -3
@@ -2,9 +2,17 @@
2 2
3 3 namespace XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
4 4
5 internal abstract class SubObjectsBase(List<IObjectInfo>? objectInfoList, IObjectInfo parent) : ISubObjects
5 internal abstract class SubObjectsBase : ISubObjects
6 6 {
7 protected readonly List<IObjectInfo> objectInfoList = objectInfoList ?? [];
7
8 protected readonly List<IObjectInfo> objectInfoList;
9
10 protected SubObjectsBase(List<IObjectInfo> objectInfoList, IObjectInfo parent)
11 {
12 this.objectInfoList = objectInfoList;
13 Parent = parent;
14 objectInfoList.ForEach(objectInfo => objectInfo.Parent = parent);
15 }
8 16
9 17 public IObjectInfo this[int index] { get => objectInfoList[index]; set => objectInfoList[index] = value; }
10 18
@@ -12,7 +20,7 @@ internal abstract class SubObjectsBase(List<IObjectInfo>? objectInfoList, IObjec
12 20
13 21 public bool IsReadOnly => false;
14 22
15 public IObjectInfo Parent { get; init; } = parent;
23 public IObjectInfo Parent { get; init; }
16 24
17 25 public void Add(IObjectInfo item) => objectInfoList.Add(item);
18 26
Modified XFEExtension.NetCore/XFETransform/XFEConverter.cs +27 -25
@@ -76,36 +76,38 @@ public class XFEConverter
76 76 /// <param name="stopInThisLayer">是否在该层停止递归</param>
77 77 /// <param name="maxLayer">最大解析深度</param>
78 78 /// <param name="maxArrayCount">数组列表的最大解析数量</param>
79 /// <param name="currentFieldInfo">字段信息</param>
80 /// <param name="currentPropertyInfo">属性信息</param>
79 81 /// <returns></returns>
80 public static IObjectInfo GetObjectInfo(IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, List<object> fatherObjectList, Type? type, object? value = null, bool onlyProperty = true, bool onlyPublic = true, bool stopInThisLayer = false, int maxLayer = 10, int maxArrayCount = 999)
82 public static IObjectInfo GetObjectInfo(IStringConverter? stringConverter, string? name, ObjectPlace objectPlace, int layer, List<object> fatherObjectList, Type? type, object? value = null, bool onlyProperty = true, bool onlyPublic = true, bool stopInThisLayer = false, int maxLayer = -1, int maxArrayCount = -1, FieldInfo? currentFieldInfo = null, PropertyInfo? currentPropertyInfo = null)
81 83 {
82 84 try
83 85 {
84 86 if (value is null || type is null)
85 87 {
86 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, true);
88 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, true);
87 89 }
88 90 if (fatherObjectList.Contains(value) && layer > 0)
89 91 {
90 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, true, "重复递归异常");
92 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, true, "重复递归异常");
91 93 }
92 if (layer > maxLayer)
94 if (layer > maxLayer && maxLayer != -1)
93 95 {
94 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, true, $"超过最大解析深度({maxLayer})");
96 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, true, $"超过最大解析深度({maxLayer})");
95 97 }
96 98 var currentFatherList = AddAndCopyFatherList(fatherObjectList, value);
97 99 var isBasicType = IsBasicType(type);
98 100 if (isBasicType)
99 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, true, value);
101 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, true, value);
100 102 else
101 103 {
102 104 if (type.IsAssignableTo(typeof(Enum)))
103 105 {
104 return new ObjectInfoImpl(stringConverter, name, ObjectPlace.Enum, layer, type, false, value);
106 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, ObjectPlace.Enum, layer, type, false, value);
105 107 }
106 108 else if (value is Exception exception)
107 109 {
108 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, false, exception.ToString());
110 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, false, exception.ToString());
109 111 }
110 112 else if (type.IsAssignableTo(typeof(Array)))
111 113 {
@@ -116,19 +118,19 @@ public class XFEConverter
116 118 currentCount++;
117 119 try
118 120 {
119 arrayObjects.Add(GetObjectInfo(stringConverter, "数组成员", ObjectPlace.ArrayMember, layer + 1, currentFatherList, item.GetType(), item, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount));
121 arrayObjects.Add(GetObjectInfo(stringConverter, "数组成员", ObjectPlace.ArrayMember, layer + 1, currentFatherList, item.GetType(), item, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount, currentFieldInfo, currentPropertyInfo));
120 122 }
121 123 catch
122 124 {
123 arrayObjects.Add(GetObjectInfo(stringConverter, "数组成员", ObjectPlace.ArrayMember, layer + 1, currentFatherList, null, null, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount));
125 arrayObjects.Add(GetObjectInfo(stringConverter, "数组成员", ObjectPlace.ArrayMember, layer + 1, currentFatherList, null, null, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount, currentFieldInfo, currentPropertyInfo));
124 126 }
125 if (currentCount > maxArrayCount)
127 if (currentCount > maxArrayCount && maxArrayCount != -1)
126 128 {
127 arrayObjects.Add(new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, true, $"数组数量超出设定最大值({maxArrayCount})"));
129 arrayObjects.Add(new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, true, $"数组数量超出设定最大值({maxArrayCount})"));
128 130 break;
129 131 }
130 132 }
131 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, false, true, value, arrayObjects);
133 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, false, true, value, arrayObjects);
132 134 }
133 135 else if (type.IsAssignableTo(typeof(IEnumerable)))
134 136 {
@@ -139,23 +141,23 @@ public class XFEConverter
139 141 currentCount++;
140 142 try
141 143 {
142 enumerableObjects.Add(GetObjectInfo(stringConverter, "列表成员", ObjectPlace.ListMember, layer + 1, currentFatherList, item.GetType(), item, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount));
144 enumerableObjects.Add(GetObjectInfo(stringConverter, "列表成员", ObjectPlace.ListMember, layer + 1, currentFatherList, item.GetType(), item, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount, currentFieldInfo, currentPropertyInfo));
143 145 }
144 146 catch
145 147 {
146 enumerableObjects.Add(GetObjectInfo(stringConverter, "列表成员", ObjectPlace.ListMember, layer + 1, currentFatherList, null, null, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount));
148 enumerableObjects.Add(GetObjectInfo(stringConverter, "列表成员", ObjectPlace.ListMember, layer + 1, currentFatherList, null, null, onlyProperty, onlyPublic, stopInThisLayer, maxLayer, maxArrayCount, currentFieldInfo, currentPropertyInfo));
147 149 }
148 if (currentCount > maxArrayCount)
150 if (currentCount > maxArrayCount && maxArrayCount != -1)
149 151 {
150 enumerableObjects.Add(new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, true, $"列表数量超出设定最大值({maxArrayCount})"));
152 enumerableObjects.Add(new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, true, $"列表数量超出设定最大值({maxArrayCount})"));
151 153 break;
152 154 }
153 155 }
154 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, false, true, value, enumerableObjects);
156 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, false, true, value, enumerableObjects);
155 157 }
156 158 if (stopInThisLayer)
157 159 {
158 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, false, false, value);
160 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, false, false, value);
159 161 }
160 162 var isType = value is Type || type.FullName == "System.RuntimeType";
161 163 var subObjects = new List<IObjectInfo>();
@@ -165,11 +167,11 @@ public class XFEConverter
165 167 {
166 168 try
167 169 {
168 subObjects.Add(GetObjectInfo(stringConverter, propertyInfo.Name, ObjectPlace.Property, layer + 1, currentFatherList, propertyInfo.PropertyType, propertyInfo.GetValue(value), onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount));
170 subObjects.Add(GetObjectInfo(stringConverter, propertyInfo.Name, ObjectPlace.Property, layer + 1, currentFatherList, propertyInfo.PropertyType, propertyInfo.GetValue(value), onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount, null, propertyInfo));
169 171 }
170 172 catch
171 173 {
172 subObjects.Add(GetObjectInfo(stringConverter, propertyInfo.Name, ObjectPlace.Property, layer + 1, currentFatherList, propertyInfo.PropertyType, null, onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount));
174 subObjects.Add(GetObjectInfo(stringConverter, propertyInfo.Name, ObjectPlace.Property, layer + 1, currentFatherList, propertyInfo.PropertyType, null, onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount, null, propertyInfo));
173 175 }
174 176 continue;
175 177 }
@@ -177,20 +179,20 @@ public class XFEConverter
177 179 {
178 180 try
179 181 {
180 subObjects.Add(GetObjectInfo(stringConverter, fieldInfo.Name, ObjectPlace.Field, layer + 1, currentFatherList, fieldInfo.FieldType, fieldInfo.GetValue(value), onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount));
182 subObjects.Add(GetObjectInfo(stringConverter, fieldInfo.Name, ObjectPlace.Field, layer + 1, currentFatherList, fieldInfo.FieldType, fieldInfo.GetValue(value), onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount, fieldInfo, null));
181 183 }
182 184 catch
183 185 {
184 subObjects.Add(GetObjectInfo(stringConverter, fieldInfo.Name, ObjectPlace.Property, layer + 1, currentFatherList, fieldInfo.FieldType, null, onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount));
186 subObjects.Add(GetObjectInfo(stringConverter, fieldInfo.Name, ObjectPlace.Property, layer + 1, currentFatherList, fieldInfo.FieldType, null, onlyProperty, onlyPublic, isType, maxLayer, maxArrayCount, fieldInfo, null));
185 187 }
186 188 }
187 189 }
188 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, false, false, value, subObjects);
190 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, false, false, value, subObjects);
189 191 }
190 192 }
191 193 catch (Exception ex)
192 194 {
193 return new ObjectInfoImpl(stringConverter, name, objectPlace, layer, type, true, $"无法获取:{ex.Message} ");
195 return new ObjectInfoImpl(currentFieldInfo, currentPropertyInfo, stringConverter, name, objectPlace, layer, type, true, $"无法获取:{ex.Message} ");
194 196 }
195 197 }
196 198 }