blob: e8fc957d9e88c08d7609fe03fc0ea8097430fbc1 (
plain)
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Tango.Core;
using Tango.FSE.Common;
namespace Tango.FSE.Procedures.Dialogs
{
public class UserInputDialogViewVM : FSEDialogViewVM
{
public class Parameter
{
public PropertyInfo PropertyInfo { get; set; }
public FieldInfo FieldInfo { get; set; }
public String Name { get; set; }
public String Value { get; set; }
}
public String Title { get; set; }
public String Message { get; set; }
public List<Parameter> Parameters { get; set; }
public Object Model { get; set; }
public UserInputDialogViewVM(String title, String message, Object model)
{
CanClose = false;
Title = title;
Message = message;
Parameters = new List<Parameter>();
Model = model;
}
public void Init()
{
try
{
if (Model.GetType().IsValueTypeOrString())
{
Parameter p = new Parameter();
p.Value = Model.ToStringSafe();
p.Name = "Value";
Parameters.Add(p);
}
else
{
foreach (var prop in Model.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
var att = prop.GetCustomAttribute<UserInput>();
Parameter p = new Parameter();
p.PropertyInfo = prop;
p.Name = att != null ? att.Name : prop.Name.ToTitle();
p.Value = prop.GetValue(Model).ToStringSafe();
Parameters.Add(p);
}
foreach (var field in Model.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public))
{
var att = field.GetCustomAttribute<UserInput>();
Parameter p = new Parameter();
p.FieldInfo = field;
p.Name = att != null ? att.Name : field.Name.ToTitle();
p.Value = field.GetValue(Model).ToStringSafe();
Parameters.Add(p);
}
}
}
catch (Exception ex)
{
throw new Exception("Error initializing the user input model.", ex);
}
}
public void FinalizeModel()
{
if (Model.GetType().IsValueTypeOrString())
{
Model = Convert.ChangeType(Parameters.First().Value, Model.GetType());
}
else
{
foreach (var p in Parameters)
{
if (p.PropertyInfo != null)
{
try
{
p.PropertyInfo.SetValue(Model, Convert.ChangeType(p.Value, p.PropertyInfo.PropertyType));
}
catch (Exception ex)
{
throw new ArgumentException($"Error setting the value '{p.Value}' for parameter '{p.PropertyInfo.Name}' of type '{p.PropertyInfo.PropertyType.Name}'.", ex);
}
}
else
{
try
{
p.FieldInfo.SetValue(Model, Convert.ChangeType(p.Value, p.FieldInfo.FieldType));
}
catch (Exception ex)
{
throw new ArgumentException($"Error setting the value '{p.Value}' for parameter '{p.FieldInfo.Name}' of type '{p.FieldInfo.FieldType.Name}'.", ex);
}
}
}
}
}
}
}
|