-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIdentificable.cs
118 lines (87 loc) · 3.21 KB
/
Identificable.cs
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
115
116
117
118
using Identicable_Nuget.Interfaces;
namespace Identicable_Nuget
{
// Esta clase se me ha ocurrido ya que, a raíz de pensar si c# tenía
// una interfaz que nos permita identidicar de manera única un objeto
// sin tener que declarar una propiedad que identifique a cada objeto en una lista.
// Podriamos hacer que la clase alvergara generícos para permitirle al usuario que
// pueda trabajar que distintas formas de identificación:
// INT => Con números enteros
// STRING => Con nif o id personalizados
public class Identificable<T> : Iidentificable<T>
{
public static int _iterador = 0;
private T _id;
public T Id
{
get
{
var defaultValue = default(T);
if (EqualityComparer<T>.Default.Equals(_id, defaultValue))
{
_id = GenerateId();
}
return _id;
}
// El método set es pensado para en momento
// de insertar un id de una base de datos
// en el módelo
set
{
_id = value;
}
}
public Identificable() { }
private T GenerateId()
{
T? id = default(T);
if (id == null) id = (T)Convert.ChangeType("", typeof(T));
Func<object> generateMethod = null;
switch(id)
{
case int:
generateMethod = () => GenerateIdInt();
break;
case string:
generateMethod = () => GenerateIdString();
break;
}
id = (T?)generateMethod.Invoke();
return id;
}
// ID TIPO INT
private int GenerateIdInt()
{
_iterador += 1;
return _iterador;
}
// ID TIPO STRING
// Cuando queremos acceder al id de un objeto que ya tiene
// generado su id se vuelve a generar otro id diferente
private string GenerateIdString()
{
Random random = new Random();
string numeros = random.Next(10000000, 99999999).ToString();
char letraInicial = ObtenerLetraAleatoria();
char letraControl = ObtenerLetraControl(numeros);
return $"{letraInicial}{numeros}{letraControl}";
}
private char ObtenerLetraAleatoria()
{
char[] letras = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z' };
Random random = new Random();
return letras[random.Next(letras.Length)];
}
private char ObtenerLetraControl(string numeros)
{
char[] letras = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z' };
// Calcular la letra a partir del número
int numero = int.Parse(numeros);
return letras[numero % 23];
}
}
}