-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPacketStruct.cs
More file actions
68 lines (51 loc) · 1.86 KB
/
PacketStruct.cs
File metadata and controls
68 lines (51 loc) · 1.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using Newtonsoft.Json.Linq;
using System.Reflection;
namespace M9Studio.ShadowTalk.Core
{
public abstract class PacketStruct
{
public override string ToString() => ToJObject().ToString();
public JObject ToJObject()
{
JObject jObject = new JObject
{
["struct"] = GetType().Name
};
var fields = GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (var field in fields)
{
var value = field.GetValue(this);
jObject[field.Name] = value != null ? JToken.FromObject(value) : JValue.CreateNull();
}
return jObject;
}
public static T Parse<T>(JObject jObject) where T : PacketStruct, new()
{
string expectedStruct = typeof(T).Name;
string actualStruct = jObject["struct"]?.ToString();
if (actualStruct != expectedStruct)
throw new InvalidOperationException($"Expected struct '{expectedStruct}', but got '{actualStruct}'.");
T instance = new T();
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (var field in fields)
{
if (!jObject.TryGetValue(field.Name, out var token))
throw new InvalidOperationException($"Missing field: {field.Name}");
object value = token.ToObject(field.FieldType);
field.SetValue(instance, value);
}
return instance;
}
public static T TryParse<T>(JObject jObject) where T : PacketStruct, new()
{
try
{
return Parse<T>(jObject);
}
catch (Exception ex)
{
return null;
}
}
}
}