返回提交历史
Modified
README.md
+26
-0
Added
XFEExtension.NetCore.AutoConfig/ProfileDictionary.cs
+155
-0
Modified
XFEExtension.NetCore.AutoConfig/ProfileList.cs
+47
-71
Modified
XFEExtension.NetCore.AutoConfig/XFEExtension.NetCore.AutoConfig.csproj
+3
-3
XFEstudio/XFEExtension.NetCore.AutoConfig
change-调整了ProfileList的泛型顺序和名称 add-新增ProfileDictionary,与ProfileList类似,可以在增删改的时候自动存储
f45692f
代码差异
4 个文件
+231
-74
@@ -32,6 +32,32 @@ class Program
32
32
}
33
33
```
34
34
35
#### 使用ProfileList和ProfileDictionary来储存集合或字典
36
37
```csharp
38
//配置文件类
39
partial class SystemProfile
40
{
41
[ProfileProperty]
42
ProfileList<SystemProfile, string> nameList = [];
43
44
[ProfileProperty]
45
ProfileDictionary<SystemProfile, string, long> nameIdDictionary = [];
46
}
47
48
//使用配置文件
49
class Program
50
{
51
static void Main(string[] args)
52
{
53
SystemProfile.NameList.Add("张三"); //在添加值的时候会自动记录并储存
54
SystemProfile.NameList.AddRange(["李四", "王五"]); //添加多条记录
55
SystemProfile.NameList.Remove("李四"); //删除值的时候也会自动记录
56
SystemProfile.NameIdDictionary.Add("张三", "0da87wd89a-0dwa8d"); //字典也是一样
57
}
58
}
59
```
60
35
61
#### 设置get和set方法
36
62
37
63
```csharp
@@ -0,0 +1,155 @@
1
using System.Collections;
2
using System.Diagnostics.CodeAnalysis;
3
using System.Runtime.Serialization;
4
5
namespace XFEExtension.NetCore.AutoConfig;
6
7
/// <summary>
8
/// 配置文件字典
9
/// </summary>
10
/// <typeparam name="TProfile">配置文件类型</typeparam>
11
/// <typeparam name="TKey">字典Key泛型</typeparam>
12
/// <typeparam name="TValue">字典Value泛型</typeparam>
13
public class ProfileDictionary<TProfile, TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, IDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IReadOnlyDictionary<TKey, TValue>, ICollection, IDictionary, IDeserializationCallback, ISerializable where TKey : notnull
14
{
15
private readonly Dictionary<TKey, TValue> _innerDictionary;
16
17
/// <summary>
18
/// 创建空字典
19
/// </summary>
20
public ProfileDictionary() => _innerDictionary = [];
21
22
/// <summary>
23
/// 使用现有字典创建
24
/// </summary>
25
/// <param name="innerDictionary">现有字典</param>
26
public ProfileDictionary(Dictionary<TKey, TValue> innerDictionary) => _innerDictionary = innerDictionary;
27
28
///<inheritdoc/>
29
public TValue this[TKey key] { get => ((IDictionary<TKey, TValue>)_innerDictionary)[key]; set => ((IDictionary<TKey, TValue>)_innerDictionary)[key] = value; }
30
///<inheritdoc/>
31
public object? this[object key] { get => ((IDictionary)_innerDictionary)[key]; set => ((IDictionary)_innerDictionary)[key] = value; }
32
33
///<inheritdoc/>
34
public int Count => ((ICollection<KeyValuePair<TKey, TValue>>)_innerDictionary).Count;
35
36
///<inheritdoc/>
37
public bool IsReadOnly => ((ICollection<KeyValuePair<TKey, TValue>>)_innerDictionary).IsReadOnly;
38
39
///<inheritdoc/>
40
public ICollection<TKey> Keys => ((IDictionary<TKey, TValue>)_innerDictionary).Keys;
41
42
///<inheritdoc/>
43
public ICollection<TValue> Values => ((IDictionary<TKey, TValue>)_innerDictionary).Values;
44
45
///<inheritdoc/>
46
public bool IsSynchronized => ((ICollection)_innerDictionary).IsSynchronized;
47
48
///<inheritdoc/>
49
public object SyncRoot => ((ICollection)_innerDictionary).SyncRoot;
50
51
///<inheritdoc/>
52
public bool IsFixedSize => ((IDictionary)_innerDictionary).IsFixedSize;
53
54
IEnumerable<TKey> IReadOnlyDictionary<TKey, TValue>.Keys => ((IReadOnlyDictionary<TKey, TValue>)_innerDictionary).Keys;
55
56
ICollection IDictionary.Keys => ((IDictionary)_innerDictionary).Keys;
57
58
IEnumerable<TValue> IReadOnlyDictionary<TKey, TValue>.Values => ((IReadOnlyDictionary<TKey, TValue>)_innerDictionary).Values;
59
60
ICollection IDictionary.Values => ((IDictionary)_innerDictionary).Values;
61
62
///<inheritdoc/>
63
public void Add(KeyValuePair<TKey, TValue> item)
64
{
65
((ICollection<KeyValuePair<TKey, TValue>>)_innerDictionary).Add(item);
66
XFEProfile.SaveProfile(typeof(TProfile));
67
}
68
69
///<inheritdoc/>
70
public void Add(TKey key, TValue value)
71
{
72
((IDictionary<TKey, TValue>)_innerDictionary).Add(key, value);
73
XFEProfile.SaveProfile(typeof(TProfile));
74
}
75
76
///<inheritdoc/>
77
public void Add(object key, object? value)
78
{
79
((IDictionary)_innerDictionary).Add(key, value);
80
XFEProfile.SaveProfile(typeof(TProfile));
81
}
82
83
///<inheritdoc/>
84
public void Clear()
85
{
86
((ICollection<KeyValuePair<TKey, TValue>>)_innerDictionary).Clear();
87
XFEProfile.SaveProfile(typeof(TProfile));
88
}
89
90
///<inheritdoc/>
91
public bool Contains(KeyValuePair<TKey, TValue> item) => ((ICollection<KeyValuePair<TKey, TValue>>)_innerDictionary).Contains(item);
92
93
///<inheritdoc/>
94
public bool Contains(object key) => ((IDictionary)_innerDictionary).Contains(key);
95
96
///<inheritdoc/>
97
public bool ContainsKey(TKey key) => ((IDictionary<TKey, TValue>)_innerDictionary).ContainsKey(key);
98
99
///<inheritdoc/>
100
public bool ContainsValue(TValue value) => _innerDictionary.ContainsValue(value);
101
102
///<inheritdoc/>
103
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) => ((ICollection<KeyValuePair<TKey, TValue>>)_innerDictionary).CopyTo(array, arrayIndex);
104
105
///<inheritdoc/>
106
public void CopyTo(Array array, int index) => ((ICollection)_innerDictionary).CopyTo(array, index);
107
108
///<inheritdoc/>
109
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() => ((IEnumerable<KeyValuePair<TKey, TValue>>)_innerDictionary).GetEnumerator();
110
111
///<inheritdoc/>
112
[Obsolete]
113
public void GetObjectData(SerializationInfo info, StreamingContext context) => ((ISerializable)_innerDictionary).GetObjectData(info, context);
114
115
///<inheritdoc/>
116
public void OnDeserialization(object? sender) => ((IDeserializationCallback)_innerDictionary).OnDeserialization(sender);
117
118
///<inheritdoc/>
119
public bool Remove(KeyValuePair<TKey, TValue> item)
120
{
121
var result = ((ICollection<KeyValuePair<TKey, TValue>>)_innerDictionary).Remove(item);
122
XFEProfile.SaveProfile(typeof(TProfile));
123
return result;
124
}
125
126
///<inheritdoc/>
127
public bool Remove(TKey key)
128
{
129
var result = ((IDictionary<TKey, TValue>)_innerDictionary).Remove(key);
130
XFEProfile.SaveProfile(typeof(TProfile));
131
return result;
132
}
133
134
///<inheritdoc/>
135
public void Remove(object key)
136
{
137
((IDictionary)_innerDictionary).Remove(key);
138
XFEProfile.SaveProfile(typeof(TProfile));
139
}
140
141
///<inheritdoc/>
142
public bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value) => ((IDictionary<TKey, TValue>)_innerDictionary).TryGetValue(key, out value);
143
144
///<inheritdoc/>
145
public bool TryAdd(TKey key, TValue value)
146
{
147
var result = _innerDictionary.TryAdd(key, value);
148
XFEProfile.SaveProfile(typeof(TProfile));
149
return result;
150
}
151
152
IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_innerDictionary).GetEnumerator();
153
154
IDictionaryEnumerator IDictionary.GetEnumerator() => ((IDictionary)_innerDictionary).GetEnumerator();
155
}
@@ -5,158 +5,134 @@ namespace XFEExtension.NetCore.AutoConfig;
5
5
/// <summary>
6
6
/// 配置文件列表
7
7
/// </summary>
8
/// <typeparam name="T">列表泛型</typeparam>
9
/// <typeparam name="P">配置文件泛型</typeparam>
10
public class ProfileList<T, P> : ICollection<T>, IEnumerable<T>, IEnumerable, IList<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection, IList
8
/// <typeparam name="TProfile">配置文件类型</typeparam>
9
/// <typeparam name="TValue">列表泛型</typeparam>
10
public class ProfileList<TProfile, TValue> : ICollection<TValue>, IEnumerable<TValue>, IEnumerable, IList<TValue>, IReadOnlyCollection<TValue>, IReadOnlyList<TValue>, ICollection, IList
11
11
{
12
private readonly List<T> innerList;
12
private readonly List<TValue> _innerList;
13
13
14
14
/// <summary>
15
/// 空列表
15
/// 创建空列表
16
16
/// </summary>
17
public ProfileList() => innerList = [];
17
public ProfileList() => _innerList = [];
18
18
19
19
/// <summary>
20
20
/// 使用已有列表创建
21
21
/// </summary>
22
22
/// <param name="innerList">已有列表</param>
23
public ProfileList(List<T> innerList) => this.innerList = innerList;
23
public ProfileList(List<TValue> innerList) => _innerList = innerList;
24
24
25
25
///<inheritdoc/>
26
public T this[int index] { get => ((IList<T>)innerList)[index]; set => ((IList<T>)innerList)[index] = value; }
27
object? IList.this[int index] { get => ((IList)innerList)[index]; set => ((IList)innerList)[index] = value; }
26
public TValue this[int index] { get => ((IList<TValue>)_innerList)[index]; set => ((IList<TValue>)_innerList)[index] = value; }
27
object? IList.this[int index] { get => ((IList)_innerList)[index]; set => ((IList)_innerList)[index] = value; }
28
28
29
29
///<inheritdoc/>
30
public int Count => ((ICollection<T>)innerList).Count;
30
public int Count => ((ICollection<TValue>)_innerList).Count;
31
31
32
32
///<inheritdoc/>
33
public bool IsReadOnly => ((ICollection<T>)innerList).IsReadOnly;
33
public bool IsReadOnly => ((ICollection<TValue>)_innerList).IsReadOnly;
34
34
35
35
///<inheritdoc/>
36
public bool IsSynchronized => ((ICollection)innerList).IsSynchronized;
36
public bool IsSynchronized => ((ICollection)_innerList).IsSynchronized;
37
37
38
38
///<inheritdoc/>
39
public object SyncRoot => ((ICollection)innerList).SyncRoot;
39
public object SyncRoot => ((ICollection)_innerList).SyncRoot;
40
40
41
41
///<inheritdoc/>
42
public bool IsFixedSize => ((IList)innerList).IsFixedSize;
42
public bool IsFixedSize => ((IList)_innerList).IsFixedSize;
43
43
44
44
///<inheritdoc/>
45
public void Add(T item)
45
public void Add(TValue item)
46
46
{
47
((ICollection<T>)innerList).Add(item);
48
XFEProfile.SaveProfile(typeof(P));
47
((ICollection<TValue>)_innerList).Add(item);
48
XFEProfile.SaveProfile(typeof(TProfile));
49
49
}
50
50
51
51
///<inheritdoc/>
52
52
public int Add(object? value)
53
53
{
54
var result = ((IList)innerList).Add(value);
55
XFEProfile.SaveProfile(typeof(P));
54
var result = ((IList)_innerList).Add(value);
55
XFEProfile.SaveProfile(typeof(TProfile));
56
56
return result;
57
57
}
58
58
59
59
///<inheritdoc/>
60
public void AddRange(IEnumerable<T> collection)
60
public void AddRange(IEnumerable<TValue> collection)
61
61
{
62
innerList.AddRange(collection);
63
XFEProfile.SaveProfile(typeof(P));
62
_innerList.AddRange(collection);
63
XFEProfile.SaveProfile(typeof(TProfile));
64
64
}
65
65
66
66
///<inheritdoc/>
67
public void AddRange(ReadOnlySpan<T> source)
67
public void AddRange(ReadOnlySpan<TValue> source)
68
68
{
69
innerList.AddRange(source);
70
XFEProfile.SaveProfile(typeof(P));
69
_innerList.AddRange(source);
70
XFEProfile.SaveProfile(typeof(TProfile));
71
71
}
72
72
73
73
///<inheritdoc/>
74
74
public void Clear()
75
75
{
76
((ICollection<T>)innerList).Clear();
77
XFEProfile.SaveProfile(typeof(P));
76
((ICollection<TValue>)_innerList).Clear();
77
XFEProfile.SaveProfile(typeof(TProfile));
78
78
}
79
79
80
80
///<inheritdoc/>
81
public bool Contains(T item)
82
{
83
return ((ICollection<T>)innerList).Contains(item);
84
}
81
public bool Contains(TValue item) => ((ICollection<TValue>)_innerList).Contains(item);
85
82
86
83
///<inheritdoc/>
87
public bool Contains(object? value)
88
{
89
return ((IList)innerList).Contains(value);
90
}
84
public bool Contains(object? value) => ((IList)_innerList).Contains(value);
91
85
92
86
///<inheritdoc/>
93
public void CopyTo(T[] array, int arrayIndex)
94
{
95
((ICollection<T>)innerList).CopyTo(array, arrayIndex);
96
}
87
public void CopyTo(TValue[] array, int arrayIndex) => ((ICollection<TValue>)_innerList).CopyTo(array, arrayIndex);
97
88
98
89
///<inheritdoc/>
99
public void CopyTo(Array array, int index)
100
{
101
((ICollection)innerList).CopyTo(array, index);
102
}
90
public void CopyTo(Array array, int index) => ((ICollection)_innerList).CopyTo(array, index);
103
91
104
92
///<inheritdoc/>
105
public IEnumerator<T> GetEnumerator()
106
{
107
return ((IEnumerable<T>)innerList).GetEnumerator();
108
}
93
public IEnumerator<TValue> GetEnumerator() => ((IEnumerable<TValue>)_innerList).GetEnumerator();
109
94
110
95
///<inheritdoc/>
111
public int IndexOf(T item)
112
{
113
return ((IList<T>)innerList).IndexOf(item);
114
}
96
public int IndexOf(TValue item) => ((IList<TValue>)_innerList).IndexOf(item);
115
97
116
98
///<inheritdoc/>
117
public int IndexOf(object? value)
118
{
119
return ((IList)innerList).IndexOf(value);
120
}
99
public int IndexOf(object? value) => ((IList)_innerList).IndexOf(value);
121
100
122
101
///<inheritdoc/>
123
public void Insert(int index, T item)
102
public void Insert(int index, TValue item)
124
103
{
125
((IList<T>)innerList).Insert(index, item);
126
XFEProfile.SaveProfile(typeof(P));
104
((IList<TValue>)_innerList).Insert(index, item);
105
XFEProfile.SaveProfile(typeof(TProfile));
127
106
}
128
107
129
108
///<inheritdoc/>
130
109
public void Insert(int index, object? value)
131
110
{
132
((IList)innerList).Insert(index, value);
133
XFEProfile.SaveProfile(typeof(P));
111
((IList)_innerList).Insert(index, value);
112
XFEProfile.SaveProfile(typeof(TProfile));
134
113
}
135
114
136
115
///<inheritdoc/>
137
public bool Remove(T item)
116
public bool Remove(TValue item)
138
117
{
139
var result = ((ICollection<T>)innerList).Remove(item);
140
XFEProfile.SaveProfile(typeof(P));
118
var result = ((ICollection<TValue>)_innerList).Remove(item);
119
XFEProfile.SaveProfile(typeof(TProfile));
141
120
return result;
142
121
}
143
122
144
123
///<inheritdoc/>
145
124
public void Remove(object? value)
146
125
{
147
((IList)innerList).Remove(value);
148
XFEProfile.SaveProfile(typeof(P));
126
((IList)_innerList).Remove(value);
127
XFEProfile.SaveProfile(typeof(TProfile));
149
128
}
150
129
151
130
///<inheritdoc/>
152
131
public void RemoveAt(int index)
153
132
{
154
((IList<T>)innerList).RemoveAt(index);
155
XFEProfile.SaveProfile(typeof(P));
133
((IList<TValue>)_innerList).RemoveAt(index);
134
XFEProfile.SaveProfile(typeof(TProfile));
156
135
}
157
136
158
IEnumerator IEnumerable.GetEnumerator()
159
{
160
return ((IEnumerable)innerList).GetEnumerator();
161
}
137
IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_innerList).GetEnumerator();
162
138
}
@@ -17,17 +17,17 @@
17
17
<PackageTags>XFE;config;profile;auto</PackageTags>
18
18
<PackageReleaseNotes>## 调整
19
19
20
调整了配置文件的默认储存位置 => 从/Profiles/xxx.xfe调整为/Profiles/xxx.xpf文件
20
调整了ProfileList的泛型顺序和名称
21
21
22
22
## 新增
23
23
24
新增ProfileList,该类型与List功能类似,但是其可以在调用Add、Remove、Clear等对列表进行增删改的操作时自动保存
24
新增ProfileDictionary,与ProfileList类似,可以在增删改的时候自动存储
25
25
26
26
## 严重
27
27
28
28
无</PackageReleaseNotes>
29
29
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
30
<Version>1.2.0</Version>
30
<Version>1.3.0</Version>
31
31
<GenerateDocumentationFile>True</GenerateDocumentationFile>
32
32
</PropertyGroup>
33
33