Φαίνεται οτι η Custom... είναι για >=.net 3.5. Εγώ όπως και να έχει ήθελα κάτι απλό...και παραθέτω τι μανούβρα έκανα...
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
| public class Person : IPerson {
private string firstName = "Scott";
private string lastName = "Hanselman";
private int age = 34;
public Person() : base() {
}
public Person( String prsn ) {
String[] text = prsn.Split('|');
Type t = this.GetType();
foreach ( String pair in text ) {
String variable = pair.Split(':')[0];
String assignment = null;
try {
assignment = pair.Split(':')[1];
} catch ( IndexOutOfRangeException ex ) {
return;
}
foreach ( FieldInfo f in t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) ) {
int i = 0;
String tmp = "";
foreach ( Char v in variable ) {
if ( i == 0 ) {
tmp += v.ToString().ToUpper();
} else
tmp += v.ToString();
i += 1;
}
try {
t.InvokeMember("set" + tmp, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, this, new object[] { assignment });
} catch ( MissingMethodException ex ) {
t.InvokeMember("set" + tmp, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, this, new object[] { Int32.Parse(assignment) });
}
}
}
}
public void setFirstName( string name ) {
this.firstName = name;
}
public void setLastName( string name ) {
this.lastName = name;
}
public void setAge( int ag ) {
this.age= ag;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
public String ToString() {
StringBuilder info = new StringBuilder();
Type t = this.GetType();
foreach ( FieldInfo f in t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) ) {
info.Append(f.Name + ":" + f.GetValue(this)+ "|" );
}
return info.ToString();
}
} |
Κρατάω όλες τις τιμές των "Fields" σε ένα ζεύγος τιμών χωρισμένων με '|'. Και όταν θέλω να δημιουργήσω καλώ την Person με όρισμα το παλιότερο Person.
Κάπως έτσι :
Person p2 = new Person();
p2.setFirstName("Nick");
p2.setLastName("TheGreek");
Person p3 = new Person(p2.ToString());
Ετσι, και δεν χάνω την αρχιτεκτονική της κλάσσης και επαναδημιουργώ το αντικείμενο με τις τιμές που είχε παλιότερα...αποθηκευμένα σε βάση.
Δεν ξέρω, αλλά αυτό δεν θα έπρεπε να το κάνει το JSON? Αν μου ξέφυγε κάτι και μπορεί να το κάνει το JSON ( ακόμα και με το JavaSerializer του System.Web πήγα, αλλά πεδεύτικα με converters κλπ....τελικά αναρωτιέμαι αν άξιζε; ) μπορώ να το ξανακάνω σε JSON ή σε κάτι άλλο.
Επίσης, το συγκεκριμένο snippet έχει 2 προβλήματα όμως που έχουν να κάνουν με τα Exception που μαζεύω.
1. Στην Invoke 28-31, επειδή έχω διάφορετικούς τύπους μεταβλητές, παίζω με τα exception, δεν θα έπρεπε όμως.
2. Τo IndexOutOfRange δεν έχω καταλάβει γιατί το πετάει!
Αν έχει κάποιος όρεξη να το εμπλουτίσει, είμαι όλος αυτιά! :-)
Καλό ΣΚ.
Να σημειώσω ότι αν θυμίζει Java setter/getter....δεν έχετε άδικο!