Sto provando a creare un metodo che passerà attraverso un elenco di oggetti generici e sostituiremo tutte le loro proprietà di tipo string
che è o null
o vuoto con una sostituzione.C#: Come ottenere tutte le proprietà di stringa pubbliche (sia get che set) di un tipo
Come è un buon modo per farlo?
ho questo tipo di ... shell ... finora:
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement)
{
var properties = typeof(T).GetProperties(-- What BindingFlags? --);
foreach(var p in properties)
{
foreach(var item in list)
{
if(string.IsNullOrEmpty((string) p.GetValue(item, null)))
p.SetValue(item, replacement, null);
}
}
}
Allora, come faccio a trovare tutte le proprietà di un tipo che sono:
- Di tipo
string
- Ha pubblico
get
Ha pubblico
set
?
ho fatto questa classe di test:
class TestSubject
{
public string Public;
private string Private;
public string PublicPublic { get; set; }
public string PublicPrivate { get; private set; }
public string PrivatePublic { private get; set; }
private string PrivatePrivate { get; set; }
}
La seguente non funziona:
var properties = typeof(TestSubject)
.GetProperties(BindingFlags.Instance|BindingFlags.Public)
.Where(ø => ø.CanRead && ø.CanWrite)
.Where(ø => ø.PropertyType == typeof(string));
se stampo il nome di queste proprietà ci si arriva, mi get:
PublicPublic pubblico e privato PrivatePublic
In altre parole, ottengo due proprietà troppo.
Nota: Questo potrebbe essere fatto probabilmente in un modo migliore ... utilizzando foreach nidificato e riflessione e tutti qui ... ma se avete grandi idee alternative, per favore fatemelo sapere perche 'io voglio imparare!
L'esempio innanzitutto sostituirà * tutti i valori * e, in secondo luogo, la proprietà CanWrite non sembra funzionare come penseremmo sarebbe ... =/ – Svish
CanWrite funziona davvero come dovrebbe. Puoi spiegare cosa ti fa pensare al contrario? –
Come mostra il mio esempio, una proprietà pubblica dichiarata come i.e.stringa pubblica Something {get; set privato;}, restituisce true sia per CanRead sia per CanWrite, anche se non dovrei riuscire a scrivere, poiché il setter è privato. – Svish