XFEExtension
【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等
关注
0
Fork
0
Star
0
返回提交历史
Modified
XFEExtension.NetCore.Test/Program.cs
+24
-3
Modified
XFEExtension.NetCore.Test/TestClass.cs
+12
-0
Modified
XFEExtension.NetCore/XFEExtension.NetCore.csproj
+3
-3
Modified
XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/IObjectInfo.cs
+14
-1
Modified
XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/ObjectInfo.cs
+11
-3
Modified
XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/ObjectInfoImpl.cs
+4
-3
Modified
XFEExtension.NetCore/XFETransform/ObjectInfoAnalyzer/SubObjectsBase.cs
+11
-3
Modified
XFEExtension.NetCore/XFETransform/XFEConverter.cs
+27
-25
XFEstudio/XFEExtension
change-XFEConverter:ObjectInfo中,添加原始的PropertyInfo和FieldInfo信息以及Parent对象
23d3e59
代码差异
8 个文件
+106
-41
@@ -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)
@@ -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
{
@@ -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
@@ -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; }
@@ -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;
@@ -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
}
@@ -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
@@ -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
}